我有一種情況,我希望自定義代碼能夠覆蓋現有的註冊。比如我有一個接口,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()時返回。但事實並非如此,它會引發上述錯誤。
感謝您的回覆。不,我們只使用Initialize()一次。我們使用許多實現Registry的類,並執行相關的Scan()將其類型添加到容器中。我發現,無論您爲接口註冊了多少具體類型,在調用GetInstance <>時總會拋出異常,除非您使用For <>()顯式註冊類型。 – macon
@macon我只看到使用WithDefaultConventions時,如果它不能匹配IFoo到Foo(因爲你有Bar:IFoo)。你認爲你可以發佈代碼,比如你的Initialize和一個示例註冊表嗎? – Andy
添加了示例代碼 – macon