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();
});