C# 找到多个与非ICollection约束匹配的导出<;T>;
我看了其他几个关于使用的帖子:C# 找到多个与非ICollection约束匹配的导出<;T>;,c#,mef,C#,Mef,我看了其他几个关于使用的帖子: [ImportMany] IEnumerable<IPlugin> plugins; ManualTransactionGenerator和BaseTransactionGenerator都位于同一个C#类库项目中 TransactionGeneratorsIntegrationTest存在于另一个UnitTest项目中 public class TransactionGeneratorsIntegrationTest { [TestMet
[ImportMany]
IEnumerable<IPlugin> plugins;
ManualTransactionGenerator和BaseTransactionGenerator都位于同一个C#类库项目中
TransactionGeneratorsIntegrationTest存在于另一个UnitTest项目中
public class TransactionGeneratorsIntegrationTest
{
[TestMethod]
public void IT_GenerateManualTransactions()
{
ManualTransactionGenerator generator = new ManualTransactionGenerator()
}
}
错误消息:
这篇作文只产生了一个作文错误。下面提供了根本原因。有关详细信息,请查看CompositionException.Errors属性
1) 找到多个与约束匹配的导出:
ContractName HL.DataAccess.Adjustment.Contracts.DataAccessObjects.ITransactionActionMasterDao
RequiredTypeIdentity HL.DataAccess.Adjustment.Contracts.DataAccessObjects.ITransactionActionMasterDao
更新:
我们改变了设计,新代码如下所示
[Export(typeof(ITransactionActionMasterDao))]
public class TransactionActionMasterDao : BaseDao, ITransactionActionMasterDao
[Export(typeof(ITransactionActionMasterDao))]
public class CustomerTransactionActionMasterDao : BaseDao, ITransactionActionMasterDao
public abstract class BaseTransactionGenerator : ITransactionGenerator
{
[Import(typeof(ITransactionActionMasterDao))]
private ITransactionActionMasterDao transactionActionMasterDao;
public BaseTransactionGenerator()
{
**//Below lines will throw error**
AggregateCatalog catalog = new AggregateCatalog(new AssemblyCatalog( typeof(TransactionActionMasterDao).Assembly),
new AssemblyCatalog( typeof(CustomerTransactionActionMasterDao ).Assembly) );
**//This is correct. We need to add ONLY one. Not both**
AggregateCatalog catalog = new AggregateCatalog(new AssemblyCatalog( typeof(TransactionActionMasterDao).Assembly);
CompositionContainer container = new CompositionContainer(catalog);
// This will set the fields (aka execute the [Import])
**//below line getting error**
container.ComposeParts(this);
}
}
这解决了我们的问题。您可能会遇到并行加载包含
[Export]
属性的多个版本的程序集的问题。要测试此理论,请尝试以下方法:
[Import]
更改为[ImportMany]
transactionActionMasterDao[i].GetType().Assembly.Location
如果是这种情况,您可能需要使用程序集绑定重定向来确保只加载包含导出的程序集的一个副本。@Servy-感谢您的支持editing@Ziggler来自同一地点的同一类的两个实例?我照你说的做了。我的计数为1,位置为XX\[MyTestProject]\bin\Debug\[TransactionActionMasterDao的程序集名称]萨姆:我更新了我的问题。我们改变了设计,解决了我们的问题。我们需要确保每个名称空间只添加一个类。若我们试图添加属于名称空间N的类A和类B,它将引发异常。我们在AggegrateCatalog中添加了A或B
transactionActionMasterDao[i].GetType().Assembly.Location