Caliburn.Mirco 简单容器多接口实例
Caliburn.Mirco Simple Container Multiple Interface Instances
我基本上是在尝试 运行 使用 Caliburn Micro 的简单容器的选项卡控件,其中每个选项卡视图模型在 c# 中实现一个接口“IMainScreenTabItem”。
设置容器时,我可以这样做:
container.AllTypesOf<IMainScreenTabItem>(Assembly.GetExecutingAssembly());
这将允许我在选项卡控件视图模型的构造函数中获取所有实现 IMainScreenTabItem 的视图模型,如下所示:
public TabControlViewModel(IEnumerable<IMainScreenTabItem> tabs){ Items.AddRange(tabs); }
这个特定应用程序的问题是,当 TabControlViewModel 被处理并且 .AllTypesOf 方法将它们注册为单例时,我不希望实现作为单例保持活动状态。
我可以像这样通过对每个视图模型进行硬编码来创建它们:
container.Instance(container)
.PerRequest<IMainScreenTabItem, TabItem1>()
.PerRequest<IMainScreenTabItem, TabItem2>();
等等..但感觉有点乱。
我在想这样的事情:
var tabs = GetType().Assembly.GetTypes()
.Where(type => type.IsClass)
.Where(type => !type.IsAbstract)
.Where(type => type.GetInterface(nameof(IMainScreenTabItem)) != null);
tabs.ToList().ForEach(tab => container.RegisterPerRequest(typeof(IMainScreenTabItem), tab.ToString(), tab));
问题是 .RegisterPerRequest 不允许我像 .PerRequest 那样拥有单个接口的多个实现。
Caliburn Micro 的网站将差异描述为“每个请求注册导致每个请求创建一次返回的实体。这意味着对同一实体的两个不同请求将导致创建两个不同的实例。”
https://caliburnmicro.com/documentation/simple-container
所以我想做这样的事情:
tabs.ToList().ForEach(tab => container.PerRequest<IMainScreenTabItem, tab>());
但显然我收到了 'tab is a variable but is used like a type' 错误消息。
如有任何想法,我们将不胜感激!这是我的第一个 Caliburn Micro 项目,所以我可能只是遗漏了一些简单的东西。
提前致谢!
您不能使用一个工厂方法来解析程序集中 IMainScreenTabItem
的所有实现吗?:
container.Handler<TabControlViewModel>(container =>
{
var tabs = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(t => t.GetInterfaces().Contains(typeof(IMainScreenTabItem)))
.Select(t => (IMainScreenTabItem)Activator.CreateInstance(t))
.ToArray();
return new TabControlViewModel();
});
我基本上是在尝试 运行 使用 Caliburn Micro 的简单容器的选项卡控件,其中每个选项卡视图模型在 c# 中实现一个接口“IMainScreenTabItem”。
设置容器时,我可以这样做:
container.AllTypesOf<IMainScreenTabItem>(Assembly.GetExecutingAssembly());
这将允许我在选项卡控件视图模型的构造函数中获取所有实现 IMainScreenTabItem 的视图模型,如下所示:
public TabControlViewModel(IEnumerable<IMainScreenTabItem> tabs){ Items.AddRange(tabs); }
这个特定应用程序的问题是,当 TabControlViewModel 被处理并且 .AllTypesOf 方法将它们注册为单例时,我不希望实现作为单例保持活动状态。
我可以像这样通过对每个视图模型进行硬编码来创建它们:
container.Instance(container)
.PerRequest<IMainScreenTabItem, TabItem1>()
.PerRequest<IMainScreenTabItem, TabItem2>();
等等..但感觉有点乱。
我在想这样的事情:
var tabs = GetType().Assembly.GetTypes()
.Where(type => type.IsClass)
.Where(type => !type.IsAbstract)
.Where(type => type.GetInterface(nameof(IMainScreenTabItem)) != null);
tabs.ToList().ForEach(tab => container.RegisterPerRequest(typeof(IMainScreenTabItem), tab.ToString(), tab));
问题是 .RegisterPerRequest 不允许我像 .PerRequest 那样拥有单个接口的多个实现。
Caliburn Micro 的网站将差异描述为“每个请求注册导致每个请求创建一次返回的实体。这意味着对同一实体的两个不同请求将导致创建两个不同的实例。” https://caliburnmicro.com/documentation/simple-container
所以我想做这样的事情:
tabs.ToList().ForEach(tab => container.PerRequest<IMainScreenTabItem, tab>());
但显然我收到了 'tab is a variable but is used like a type' 错误消息。
如有任何想法,我们将不胜感激!这是我的第一个 Caliburn Micro 项目,所以我可能只是遗漏了一些简单的东西。
提前致谢!
您不能使用一个工厂方法来解析程序集中 IMainScreenTabItem
的所有实现吗?:
container.Handler<TabControlViewModel>(container =>
{
var tabs = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(t => t.GetInterfaces().Contains(typeof(IMainScreenTabItem)))
.Select(t => (IMainScreenTabItem)Activator.CreateInstance(t))
.ToArray();
return new TabControlViewModel();
});