2013-09-05 34 views
1

我有一種情況,我希望自定義代碼能夠覆蓋現有的註冊。比如我有一個接口,StructureMap:顯式與掃描註冊之間的區別

public interface IInterface{ int Num {get;set;} 

,默認情況下解析,

public class CoreClass: IInterface{...} 

(NB。這個註冊是由SM的掃描()功能(WithDefaultConventions,SingleImplementationsOfInterface)

做現在我想要一段自定義代碼來加入SM初始化過程,並用自己的實現覆蓋現有的IInterface註冊,

public class CustomClass: IInterface {...} 

這是問題所在。如果我也通過我的自定義組件做一個掃描(),並使用相同的SM約定以上(WithDefaultConventions,SingleImplementationsOfInterface),然後在運行時,當我做的GetInstance我得到的異常,

No Default Instance defined for PluginFamily IInterface 

但是,當這樣做登記我使用

x.For<IInterface>().Use<CustomClass>() 

這一切都有效。

此外,當我使用,

ObjectFactory.WhatDoIHave() 

然後我得到根據登記的方法略微不同的結果詢問容器。 WhatDoIHave()基本上向你展示了一些PLUGINTYPE,這些東西被註冊了。名稱列顯示註冊的具體類型。當我掃描()和有多個實現,然後我看到.Net類型名稱的具體類型找到。但是當我使用<>()方法的時候,我看到了上面的多個實現,但是在For的<>()語句中使用的具體類型旁邊還有一個GUID(我假設這表示默認註冊?)

現在很多SO帖子都表明最後一次註冊獲勝(這是我想要的行爲),但是我想知道的是,如果這隻適用於顯式註冊(即使用<>)。當我掃描()我可以假設SM是在一個更「非確定性」的方式行事,並不保證最後找到的實現贏或我錯過了什麼?

謝謝&對於冗長的帖子感到抱歉!

編輯: [樣本註冊的請求代碼]

  ObjectFactory.Initialize(x => 
      { 
       x.AddRegistry<CoreRegistry>(); 
       x.AddRegistry<ClientRegistry>(); 
      }); 


    public class CoreRegistry : Registry 
{ 
    public CoreRegistry() 
    { 
     //Presentation 
     Scan(x => 
     { 
      x.AssemblyContainingType<SomeCoreType>(); 
      x.WithDefaultConventions(); 
      x.SingleImplementationsOfInterface(); 
      x.AddAllTypesOf<ConfigurableEntityViewModel>(); 
     }); 

     // Domain 
     Scan(x => 
     { 
      x.AssemblyContainingType<AnotherCoreType>(); 
      x.WithDefaultConventions(); 
      x.SingleImplementationsOfInterface(); 
     }); 
... 
} 

    public class ClientRegistry : Registry 
    { 
     public ClientRegistry() 
     { 
      //Presentation 
      Scan(x => 
      { 
       x.AssemblyContainingType<SomeClientType>(); 
       x.WithDefaultConventions(); 
       x.SingleImplementationsOfInterface(); 
      }); 
    } 
} 

,所以我希望,從ClientRegistry具體實現(例如IInterface)將被註冊最後在容器,因此將是「默認」註冊並在調用GetInstance()時返回。但事實並非如此,它會引發上述錯誤。

回答

1

我相信最後總是勝利也適用於WithDefaultConventions。就掃描而言,我不知道有保證程序集總是以相同的順序掃描。我不知道它是按文件名首先排序程序集,還是執行其他一些邏輯,或者僅僅依賴於操作系統返回文件夾中文件的順序。

我們在嘗試使用WithDefaultConventions時遇到了很多問題,以至於我們禁止在我的公司使用它,並要求開發人員創建具有明確註冊的註冊表。

另外,看起來可能有一個bug SingleInterfaceImplementations。我自己並沒有使用這種方法,所以我不確定它是否應該將IInterface連接到CustomClass。我知道WithDefaultConventions不會那樣做。

最後一點;你不會顯示你的掃描碼。如果您多次使用「初始化」,它將從StructureMap中清除以前的任何註冊。我們有一些問題,我們的一些註冊管理機構試圖掃描並添加特定的接口,但由於他們正在執行初始化,所以清除了應用程序初始化。我們現在只允許在註冊表中進行配置。

+0

感謝您的回覆。不,我們只使用Initialize()一次。我們使用許多實現Registry的類,並執行相關的Scan()將其類型添加到容器中。我發現,無論您爲接口註冊了多少具體類型,在調用GetInstance <>時總會拋出異常,除非您使用For <>()顯式註冊類型。 – macon

+0

@macon我只看到使用WithDefaultConventions時,如果它不能匹配IFoo到Foo(因爲你有Bar:IFoo)。你認爲你可以發佈代碼,比如你的Initialize和一個示例註冊表嗎? – Andy

+0

添加了示例代碼 – macon

相關問題