2013-01-03 50 views
5

我是DI概念的新手,剛剛接觸到結構映射。我試圖完全填充一個場景,其中所有的接口位於AssemblyA,我的所有實現均位於AssemblyB。我想用Structuremap注入AssemblyB類的構造函數對接口的依賴從AssemblyA使用結構映射從多個裝配進行依賴注入

public class Customer(ICustomerService) 
{ 

} 

ICustomerServiceAssemblyACustomerService類是assemblyB的實例。我希望Structuremap在此構造函數中注入CustomerService實例。我假設,如果類的名稱是相同的前綴名稱和I。結構圖會自動識別它。

我寫了下面的配置。

x => 
     { 


      x.Scan(scan => 
       { 
        scan.Assembly("AssemblyA"); 
        scan.Assembly("AssemblyB"); 
        scan.TheCallingAssembly(); 
        scan.WithDefaultConventions(); 
      }); 

,但它給了我錯誤

StructureMap Exception Code: 202 
No Default Instance defined for PluginFamily AssemblyA.ICustomerService, AssemblyA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 

任何幫助將是有益的。我想使用默認約定並避免將每個接口註冊到一個類中。

謝謝。

回答

1

好吧,我得到它的工作,但我現在更加困惑。

此代碼似乎工作

IContainer container = new Container(c => 
      { 
       c.Scan(x => 
       { 
        x.Assembly("AssemblyA"); 
        x.Assembly("AssemblyB"); 
        x.IncludeNamespace("AssemblyA"); 
        x.TheCallingAssembly(); 
        x.WithDefaultConventions(); 
       }); 
      }); 

這裏我簡單補充x.IncludeNamespace( 「AssemblyA」); AssemblyB掃描後認爲它需要這個命名空間並且它已經開始工作。

我的問題已解決,但我不知道什麼是錯的,或者如果這是正確的路要走。任何幫助仍將不勝感激。

+0

好吧,我能夠理解發生了什麼。我有多個類正在執行我正在掃描的不同程序集中的接口。這產生了我在問題中報告的原始錯誤。如果只有一個類在所有掃描程序集中滿足SM的默認約定,則我在問題中發佈的代碼應該可以正常工作。我之前沒有得到它,但希望它可以幫助任何人敲打他的頭。 只要我添加了x.IncludeNamespace(「AssemblyA」);基本上我過濾了類的程序集爲SM,它開始工作:) –