Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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# 找到多个与非ICollection约束匹配的导出<;T>;_C#_Mef - Fatal编程技术网

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