2015-05-29 26 views
0

我有一個接口和兩個類實現此接口。在這種情況下,我無法使用MEF概念。我的代碼如下。請幫助我使用MEF轉換相同的內容。託管可擴展框架 - 當兩個類實現一個接口時無法使用mef

public interface IResultsRepository 
    { 
     IList<string> GetResults(); 
     string GetSummary(); 
    } 

[Export(typeof(IResultsRepository))] 
public class ExcelResultsRepository : IResultsRepository 
{ 
    private readonly string filePath; 
    private readonly string worksheetName; 
    [ImportingConstructor] 
    public ExcelResultsRepository([Import("FilePath")]string filePath, [Import("WorkSheetName")]string worksheetName) 
    { 
     this.filePath = filePath; 
     this.worksheetName = worksheetName; 
    } 
    public IList<string> GetResults() 
    { 
    } 
    public string GetSummary() 
    { 
    } 
} 

[Export(typeof(IResultsRepository))] 
public class ResultsFormRepository : IResultsRepository 
{ 
    private readonly ResultForm resultForm; 
    [ImportingConstructor] 
    public ResultsFormRepository([Import("ResultFormInstance")]ResultForm resultForm) 
    { 
     this.resultForm = resultForm; 
    } 
    public IList<string> GetResults() 
    { 

    } 
    public string GetSummary() 
    { 
    } 
} 

[Export("ResultFormInstance")] 
public class ResultForm 
{ 
    public string Tables 
    { 
     get { return ""; } 
    } 

    public string Summary 
    { 
     get 
     { 
      return ""; 
     } 
    } 
} 

[Export] 
public class ResultsContentConverter 
{ 
    private readonly IResultsRepository resultRepository; 

    [ImportingConstructor] 
    public ResultsContentConverter([Import(typeof(IResultsRepository))]IResultsRepository resultRepository) 
    { 
     this.resultRepository = resultRepository; 
    } 

    public ResultContent GetResultContent() 
    { 
     //logic to convert the format and return formatted object containg results and summary 
    } 
} 

[TestFixture] 
[Export] 
public class ResultComapreTest 
{ 
    [Import] 
    private ResultsContentConverter excelContentConverter; 

    [Import("ResultFormConverter", typeof(IResultsRepository))] 
    private ResultsContentConverter resultFormContentConverter; 

    [Test] 
    public void CompareResultFromResultForm() 
    { 
     ResultContent expectedResult; 
     ResultContent actualResult; 

     using (IResultsRepository excelResultsRepository = new ExcelResultsRepository(@"C:\Users\akuma211\Abhineet\Project\Sample\UnityContainerLearning\Sample\book1.xlsx", "sheet1")) 
     { 
      var converter = new ResultsContentConverter(excelResultsRepository); 

      expectedResult = converter.GetResultContent(); 
     } 

     using (IResultsRepository resultsRepository = new ResultsFormRepository(new ResultForm())) 
     { 
      var converter = new ResultsContentConverter(resultsRepository); 

      actualResult = converter.GetResultContent(); 
     } 

     Assert.AreEqual(expectedResult.Summary, actualResult.Summary); 
     Assert.AreEqual(expectedResult.Tables[0].Rows.Count, actualResult.Tables[0].Rows.Count); 
    } 
} 

在測試方法中,我應該使用MEF。請幫我

感謝

嗨,我在下面的編輯,因爲我想的測試方法。

[Test] 
     public void CompareResultFromResultForm() 
     { 
      ResultContent expectedResult; 
      ResultContent actualResult; 

      Compose();// MEF composer, that composes my ResultsContentConverter object 
      //using (IResultsRepository excelResultsRepository = new ExcelResultsRepository(@"C:\Users\akuma211\Abhineet\Project\Sample\UnityContainerLearning\Sample\book1.xlsx", "sheet1")) 
      //{ 
      // var converter = new ResultsContentConverter(excelResultsRepository); 

      // expectedResult = converter.GetResultContent(); 
      //} 
      expectedResult = excelContentConverter.GetResultContent(); 

      //using (IResultsRepository resultsRepository = new ResultsFormRepository(new ResultForm())) 
      //{ 
      // var converter = new ResultsContentConverter(resultsRepository); 

      // actualResult = converter.GetResultContent(); 
      //} 
      actualResult = resultFormContentConverter.GetResultContent(); 

      Assert.AreEqual(expectedResult.Summary, actualResult.Summary); 
      Assert.AreEqual(expectedResult.Tables[0].Rows.Count, actualResult.Tables[0].Rows.Count); 
     } 

HI我用importmany,這樣做,如下

ResultContent expectedResult; 
      ResultContent actualResult; 

      var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 
      var container = new CompositionContainer(catalog); 
      container.ComposeExportedValue<string>("FilePath", @"C:\Users\akuma211\Abhineet\Project\Sample\UnityContainerLearning\Sample\book1.xlsx"); 
      container.ComposeExportedValue<string>("WorkSheetName", "sheet1"); 
      container.ComposeExportedValue<ResultForm>("ResultFormInstance", new ResultForm()); 

      container.ComposeParts(this); 
      //ResultComapreTest obj = container.GetExportedValue<ResultComapreTest>(); 

      foreach (IResultsRepository rep in repository) 
      { 
       var converter = new ResultsContentConverter(rep); 
       converter.GetResultContent(); 
      } 

但我不希望創建運用新的ResultsContentConverter對象。 相反的foreach我用

using (IResultsRepository excelResultsRepository = (repository.Where(rep => rep.GetType() == typeof(ExcelResultsRepository)).Select(rep => rep).First())) 
      { 
       var converter = new ResultsContentConverter(excelResultsRepository); 

       expectedResult = converter.GetResultContent(); 
      } 

      using (IResultsRepository resultsRepository = (repository.Where(rep => rep.GetType() == typeof(ResultsFormRepository)).Select(rep => rep).First())) 
      { 
       var converter = new ResultsContentConverter(resultsRepository); 

       actualResult = converter.GetResultContent(); 
      } 

      Assert.AreEqual(expectedResult.Summary, actualResult.Summary); 
      Assert.AreEqual(expectedResult.Tables[0].Rows.Count, actualResult.Tables[0].Rows.Count); 
+0

你到底在問什麼?你能解釋一下你的問題究竟是什麼?你有錯誤嗎?編譯時或運行時?什麼錯誤信息?你的斷言失敗了嗎? – nvoigt

+0

我想讓我的resultcontentconverter對象使用mef –

+0

創建好吧,那就是你想要的。你嘗試了什麼?發生了什麼?你預期會發生什麼? – nvoigt

回答

0

當然MEF給你一個組成異常。 您正在給框架提供兩個相同接口的實現。 MEF如何能夠檢測到你想要的那個實現?

你可以解決這個問題並使用[ImportMany],它將基本上導入IResultsRepository接口的所有可用實現。

你會得到一個可用的實現列表,你可以循環找到你想要單元測試的實現。

欲瞭解更多信息,請參閱本網頁: https://msdn.microsoft.com/de-de/library/dd460648(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.componentmodel.composition.importmanyattribute(v=vs.110).aspx

http://dotnetbyexample.blogspot.de/2010/04/very-basic-mef-sample-using-importmany.html

一個簡單的例子: 有你的界面:

public interface IResultsRepository 
{ 
    IList<string> GetResults(); 
    string GetSummary(); 
} 

和兩個類實現這個界面:

[Export(typeof(IResultsRepository))] 
class CustomResultContainer : IResultsRepository 
{ 
    [ImportingConstructor] 
    public CustomResultContainer(IDoNothing nothing) 
    { 
    } 

    public IList<string> GetResults() 
    { 
     throw new NotImplementedException(); 
    } 

    public string GetSummary() 
    { 
     throw new NotImplementedException(); 
    } 
} 

[Export(typeof(IResultsRepository))] 
class ResultContainerWithLogging : IResultsRepository 
{ 
    [ImportingConstructor] 
    public ResultContainerWithLogging(ILogger logger) 
    { 

    } 

    public IList<string> GetResults() 
    { 
     throw new NotImplementedException(); 
    } 

    public string GetSummary() 
    { 
     throw new NotImplementedException(); 
    } 
} 

請注意,構造函數互不相同,每個類都依賴於不同的接口(代表您的用例)。 Bot界面被mef注入。你可以找到這個部分在這裏:

[Export(typeof(ILogger))] 
class VoidLogger : ILogger 
{ 
    public void Log() 
    { 
     Console.Write("Void Logging"); 
    } 
} 

[Export(typeof(IDoNothing))] 
class DoNothingStub : IDoNothing 
{ 
    public void doNothing() 
    { 

    } 
} 

interface ILogger 
{ 
    void Log(); 
} 

interface IDoNothing 
{ 
    void doNothing(); 
} 

現在組成了這一切在一起:

 private void startup() 
    { 
     var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly().Location); 
     var container = new CompositionContainer(catalog); 
     container.ComposeParts(this); 

     foreach (var resultsRepository in this.repositories) 
     { 
      Debugger.Break(); 
     } 
    } 

    [ImportMany] 
    public List<IResultsRepository> repositories { get; set; } 
} 

這會給我irepositories的名單exactl兩個元素,因爲MEF發現兩種實現方式,並將其注射給我。

+0

我正在嘗試相同的。但是這兩個類都有一個導入構造函數,它對於兩個實現者類的存儲庫--ResultsFormRepository和ExcelResultsRepository具有不同的參數。我嘗試使用私有IEnumerable 存儲庫;但我怎麼用參數來組合這個。 –

+0

我沒有看到importmany的任何示例,其中有不同數據類型的構造函數參數 –

+0

添加了一個示例。 – Xeun

相關問題