Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用MEF作为工厂_C#_.net_Wcf_Mef - Fatal编程技术网

C# 如何使用MEF作为工厂

C# 如何使用MEF作为工厂,c#,.net,wcf,mef,C#,.net,Wcf,Mef,我想获得一个使用MEF能力的实例 我有一个实现接口的类: [Export(typeof(IUsersRepository))] public class UsersRepository : DAL.IUsersRepository { 我有一些服务(这是WCF项目)使用了这个UsersRepository,所以这就是我尝试做的: #region Members [Import(typeof(IUsersRepository))] IUsersRepository Use

我想获得一个使用MEF能力的实例

我有一个实现接口的类:

[Export(typeof(IUsersRepository))]
public class UsersRepository : DAL.IUsersRepository
{
我有一些服务(这是WCF项目)使用了这个
UsersRepository
,所以这就是我尝试做的:

    #region Members
    [Import(typeof(IUsersRepository))]
    IUsersRepository UsersRepository;
    #endregion

    #region Constructors 
    public ChatService()
    {
        ICompositionService x = new CompositionContainer(new ApplicationCatalog());
        x.SatisfyImportsOnce(UsersRepository);
    }
    #endregion
但是,我有两个错误(第一个实际上是警告):


  • UsersRepository
    从未使用过
  • UsersRepository为空
  • 因此,我得到一个例外:

    x.SatisfyImportsOnce(UsersRepository);
    
    我该如何以正确的方式制作?(我在谷歌上搜索过,没有找到对我有用的东西)

    编辑:(在阅读第一个回复后)

    因此,我设法做到了以下几点:

       #region Members
        [Import(typeof(IUsersRepository))]
        public IUsersRepository UsersRepository;
        [Import(typeof(IRoomsRepository))]
        public IRoomsRepository RoomsRepository;
    
        private CompositionContainer _container;
        #endregion
    
        #region Constructors 
        public ChatService()
        {            
            //An aggregate catalog that combines multiple catalogs
            var catalog = new AggregateCatalog();
    
            //Adds all the parts found in the same assembly as the Program class
            catalog.Catalogs.Add(new AssemblyCatalog(typeof(ChatService).Assembly));
    
            //Create the CompositionContainer with the parts in the catalog
            _container = new CompositionContainer(catalog);
    
            //Fill the imports of this object
            try
            {
                this._container.ComposeParts(this);
            }
            catch (CompositionException compositionException)
            {
                Console.WriteLine(compositionException.ToString());
            }
        }
        #endregion
    
    但我得到了以下错误:

    未找到与约束匹配的导出:ContractName DAL.IUSERS保留要求类型标识DAL.IUSERS保留


    虽然我确实如上所述为这个接口定义了导出类

    为什么不按常规做呢

    [ImportMany]
    private IEnumerable<Lazy<IPostHandler, IPostHandlerCapabilities>> _postHandlersPlugins = null;
    private CompositionContainer _compositionContainer;
    
    ......
    public void SomeInitFunction() 
    {
        catalog.Catalogs.Add(new AssemblyCatalog(assembly));
        _compositionContainer = new CompositionContainer(catalog);
    
        try
        {
            _compositionContainer.ComposeParts(this);
        }
        catch (CompositionException ex)
        {
            ;
        }
    }
    
    [ImportMany]
    private IEnumerable_postHandlersPlugins=null;
    私有合成容器_合成容器;
    ......
    public void SomeInitFunction()
    {
    catalog.Catalogs.Add(新组装目录(组装));
    _compositionContainer=新的compositionContainer(目录);
    尝试
    {
    _compositionContainer.ComposeParts(此);
    }
    捕获(合成例外)
    {
    ;
    }
    }
    
    _postHandlersPlugins是用Export属性修饰的实体,请注意状态-因为您可以在共享状态下工作(默认情况下为Singleton),或者对于将重新创建的项目的每个请求,我正在使用lazy,以便在有人真正需要时创建插件。关于init-大多数情况下,它是从ctor调用的。容器是搜索所有零件(具有导出属性的类)的位置保持器


    调试时,请查看目录并查看是否找到零件。如果它找到了您的部件,但它们不是在合成后创建的-可能是因为您没有默认的CTOR,并且合成失败,因为它可以解析参数。如果你在目录中看不到零件,那就意味着你在目录中添加了错误的组件?您在哪里使用postHandlersPlugins?我应该告诉容器在哪里创建我所需类的实例?
    UsersRepository
    可能是在另一个程序集中定义的-创建
    DirectoryCatalog
    而不是
    AssemblyCatalog
    我通过以下方法解决了它:catalog.Catalogs.Add(newassemblycatalog(assembly.Load(“DAL”));