带有托管扩展框架 (MEF) 的工厂模式

2024-01-12

我正在尝试使用 MEF 实现工厂模式。

这是我的解决方案

核心项目

IClass
ObjectFactory static Class(This is where the problem is)

项目A

[Export(typeof(IClass))]
[ExportMetadata("Type", "TypeA")]
public classA : IClass
{}

ProjectB

[Export(typeof(IClass))]
[ExportMetadata("Type", "TypeB")]
public classB : IClass
{}

当我尝试动态创建对象时遇到问题

这是工厂类:

public static class ObjectFactory
{
    private static readonly CompositionContainer _container;

    [ImportMany]
    public static IEnumerable<Lazy<IClass, IMetaData>> objectTypes;
    static ObjectFactory()
    {
        AggregateCatalog catalog = new AggregateCatalog();

        catalog.Catalogs.Add(new DirectoryCatalog(Environment.CurrentDirectory));
        _container = new CompositionContainer(catalog);

        try
        {
            objectTypes = _container.GetExports<IClass, IMetaData>();
        }
        catch (CompositionException compositionException)
        {
            Console.WriteLine(compositionException.ToString());
            Console.ReadLine();
        }
    }

    public static IClass CreateObject(ObectType objectType)
    {
        IClass outProvider;

        Type typeToLoad = objectTypes.Where(x => x.Metadata.Type == objectType.ToString()).FirstOrDefault().GetType();
        outProvider = (IClass)Activator.CreateInstance(typeToLoad);

        return outProvider;
    }
}

如果您希望在每次调用 CreateObject 时提供一个新的“NonShared”实例,那么我建议进行此重构。

private static readonly CompositionContainer _container;

static ObjectFactory()
{       
    var directoryCatalog = new DirectoryCatalog(Environment.CurrentDirectory)
    _container = new CompositionContainer(directoryCatalog);        
}

public static IClass CreateObject(ObectType objectType)
{       
    var objectTypes objectTypes = new List<Lazy<IClass, IMetaData>>();
    try
    {
       objectTypes.AddRange(_container.GetExports<IClass, IMetaData>());
    }
    catch (CompositionException compositionException)
    {
        Console.WriteLine(compositionException.ToString());
        Console.ReadLine();
    }

    return objectTypes.FirstOrDefault(x => x.Metadata.Type == objectType.ToString());
}

您会看到 MEF 每次组合类型或调用 GetExports(以及此函数的所有其他重载)时都会解析新实例(即非共享实例)。或者,您可以导出 IClass 工厂,然后您将拥有这些提供程序的集合。

附:您示例中的 objectTypes 成员上的 [ImportMany] 是多余的,因为您没有编写这种类型(我不相信您甚至可以,因为它是静态的),您只需从 GetExports 的输出以编程方式设置它

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有托管扩展框架 (MEF) 的工厂模式 的相关文章

随机推荐

  • JavaScript/PHP 注册电子邮件确认工作流程的安全注意事项

    我正在为我的 JavaScript PHP 网站构建用户注册工作流程 用户注册后 他们就会被添加到数据库中 处于非活动状态 然后 用户将收到一封确认电子邮件 这需要他们单击确认链接 目前 确认链接会将用户重定向到站点登录页面 并以确认码作为
  • Android N Preview 模拟器崩溃

    我在新的 Android N 预览模拟器上一开始就遇到了这个崩溃 qemu fatal goldfish tty read Bad offset 20 RAX 0000000000000009 RBX 0000000000000000 RC
  • Java UTF-8 奇怪的行为

    我正在尝试用 Java 解码一些 UTF 8 字符串 这些字符串包含一些组合 unicode 字符 例如 CC 88 组合分音符 根据 字符顺序似乎没问题http www fileformat info info unicode char
  • Java Swing:清除 JPanel 中与 JLayeredPane 中的其他 JPanel 重叠的自定义绘制

    我有一个包含三个 JPanel 的 JLayeredPane 其中两个重叠 我正在向其绘制形状 重叠的两个 JPanel 之一需要清除绘制到其上的每个形状 而不影响绘制到其下方的 JPanel 的形状从屏幕上消失 目前我正在使用这样的东西
  • 将 Opencv Hsv 转换为等价于 Matlab Hsv

    我必须使用opencv开发android代码 代码相当于MATLAB 因为我必须读取图像并将其转换为 HSV 我已经使用以下方法完成了此操作 Imgproc cvtColor temp hsv Imgproc COLOR RGB2HSV 当
  • 如何在 log4j2 属性中设置类的日志级别

    在 log4j 中 我可以在属性文件中指定一个类以在调试级别进行日志记录 如下所示 log4j logger com mycompany mypackage ClassName DEBUG 我如何在 log4j2 中执行此操作 注意我仍然需
  • 角材质内的 routerLink

    a a
  • 数据库设计:成员表是单独的还是全部在一张表中?

    我想创建一个包含个人信息和登录详细信息的朋友表 将members表分成2个表更好 一个包含最少的细节 其次是其他细节 还是留在一张桌子上 我有很多包含成员外键的表 这在很大程度上取决于那些 其他 细节是什么 这是一个常见且有趣的问题 乍一看
  • 方法参数级别的 @ModelAttribute 注释的含义是什么?

    Spring 3 参考资料告诉我们 当你把它放在一个方法上时 范围 ModelAttribute映射一个 模型属性具体 带注释的方法参数 我不明白这个魔咒 因为我确定模型对象的别名 如果使用则为键值 ModelMap作为返回类型 在执行请求
  • 如何忽略已经提交的文件?

    之前 以下是我的 gitignore file config database yml DS Store 后来我创建了一个app config yml文件放在 config 目录中并提交 现在 我意识到我不需要app config ymlg
  • 无法从 onBackgroundMessage 启动 Activity

    刚刚创建了一个新的 Flutter 应用程序 最终当我收到通知时尝试打开我的应用程序或显示全屏活动 例如电话 现在只是尝试控制台登录通过后台消息处理程序调用的本机类 当我发送通知时收到此错误 您看到我做错了什么吗 我应该有不同的方法来处理这
  • SQL Server 快进游标

    人们普遍认为 应尽可能避免在存储过程中使用游标 用基于集合的逻辑等替换 如果您需要迭代某些数据 并且可以以只读方式执行 那么快进 只读前进 游标是否比 while 循环效率更高或更低 根据我的调查 光标选项通常速度更快 并且使用更少的读取和
  • 如何在 Thymeleaf 中使用 Dates.Format 和区域设置

    我正在尝试使用 Thymeleaf 中的区域设置格式化日期 我已经使用了dates format td td td td 但以上都不起作用 我基于这个已经解决的问题https github com thymeleaf thymeleaf e
  • .NET 中的货币格式

    我试图了解货币格式在 NET 框架中的工作原理 据我了解 Thread CurrentCulture NumberFormatInfo CurrencySymbol 包含当地文化的货币符号 但在我看来 在现实世界中 特定文化和货币符号之间并
  • 方法头中“静态”的含义是什么?

    我想了解 writeNumbers 方法标头中的 static 一词有何作用 public class DisplayClass param args public static void main String args writeNum
  • 接收参数并移动可能失败的函数的语义(强大的异常安全性)

    我有一个函数 可以对作为接收器参数传入的大量数据进行操作 我的BigDatatype 已经支持 C 11 并且带有功能齐全的移动构造函数和移动赋值实现 因此我可以摆脱困境 而不必复制该死的东西 Result processBigData B
  • 这段C代码有什么问题吗?

    我的源代码 include
  • 为 Java 程序制作 OSX 应用程序包,而无需用户界面在应用程序运行时保留在 Dock 中

    今天我尝试为 Java 应用程序创建我的第一个 OSX 应用程序包 它有效 但有一个问题 我找不到任何解决方案 Java 应用程序是一个没有用户界面的 Web 服务器 当我启动应用程序包时会发生以下情况 应用程序图标在 Dock 中弹跳几次
  • 查找一组垂直线段中所有不相交的交点

    我有一组由 y1 和 y2 坐标定义的垂直区域 其中 y1 是每个区域的起点 y2 是终点 我的坐标系原点是左上角 因此 y2 始终大于 y1 这是一个例子 var regions 10 100 50 120 60 180 140 220
  • 带有托管扩展框架 (MEF) 的工厂模式

    我正在尝试使用 MEF 实现工厂模式 这是我的解决方案 核心项目 IClass ObjectFactory static Class This is where the problem is 项目A Export typeof IClass