【发布时间】:2014-01-22 21:11:21
【问题描述】:
我想获得一个使用 MEF 能力的实例。
我有这个实现接口的类:
[Export(typeof(IUsersRepository))]
public class UsersRepository : DAL.IUsersRepository
{
我有一些使用这个UsersRepository 的服务(这是 WCF 项目)所以这是我尝试做的:
#region Members
[Import(typeof(IUsersRepository))]
IUsersRepository UsersRepository;
#endregion
#region Constructors
public ChatService()
{
ICompositionService x = new CompositionContainer(new ApplicationCatalog());
x.SatisfyImportsOnce(UsersRepository);
}
#endregion
但是,我得到了两个错误(第一个实际上是一个警告):
-
UsersRepository从未使用过 -
UsersRepository is null
因此我在以下位置遇到异常:
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.IUsersRepository 必需的TypeIdentity DAL.IUsersRepository
虽然我确实如上所述为此接口定义了导出类。
【问题讨论】:
-
UsersRepository可能在另一个程序集中定义 - 创建一个DirectoryCatalog而不是AssemblyCatalog -
我解决了这个问题:catalog.Catalogs.Add(new AssemblyCatalog(Assembly.Load("DAL")));