C# 如何使用MEF作为工厂
我想获得一个使用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
[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”));