2016-04-28 54 views
0

我從另外一個如何解決基本接口的實例與簡單的注射器

public interface ISpecificHandler : IHandler 

繼承了簡單的噴油器註冊我的類型和實現

container.RegisterSingleton<ISpecificHandler, SpecificHandlerImpl>(); 

但我怎麼能只是一個接口解決IHandler而不是ISpecificHandler

//Expect SpecificHandlerImpl as handler 
IHandler handler = ServiceLocator.GetInstance<IHandler>(); //error 

這引發了IHandler類型未註冊

+0

你爲什麼要這樣做?你有多少個IHandler實現? – Steven

+0

這只是一個示例場景。無論如何,我可以有多個實現。如果我可以將'SpecificHandlerImpl'轉換爲'IHandler',爲什麼不通過一個IOC容器來解決呢? – mamuesstack

+0

「爲什麼不通過IOC容器解決它們呢?」。因爲這很容易導致你的代碼和設計不明確。沒有更具體的,沒有人可以真正的建議你解決這個問題的最好方法是什麼。所以我建議發佈完整的'IHandler'和'ISpecificHandler'定義,描述你有多少其他實現,並展示一些你期望如何使用這個'IHandler'的例子。 – Steven

回答

3

有幾種解決方案的InvalidOperationException,但它確實取決於你的應用程序的真正需求。這裏有一些建議。

你剛纔註冊的實施兩次:

container.Register<IHandler, SpecificHandlerImpl>(Lifestyle.Scoped); 
container.Register<ISpecificHandler, SpecificHandlerImpl>(Lifestyle.Scoped); 

但是,也許你想解決多個處理程序,在這種情況下,你將有可能將其註冊爲一個集合:

var reg1 = Lifestyle.Singleton.CreateRegistration<SpecificHandlerImpl>(); 
var reg2 = Lifestyle.Singleton.CreateRegistration<AnotherHandlerImpl>(); 

container.RegisterCollection<IHandler>(new[] { reg1, reg2 }); 

你可能但在使用非通用接口時遇到麻煩,因爲通常會有一個特定實現應該在特定情況下執行(換句話說,您可能違反了Liskov Substitution Principle)。所以你通常會更好地使用通用的IHandler<T>抽象,其中T是一個包含處理程序值的參數對象。在這種情況下,在關閉的IHandler<T>與實現之間始終存在一對一映射。 This article對這種設計的優點給出了很好的解釋。

但是,如果不知道您正在嘗試解決的問題,很難說什麼纔是適合您的正確解決方案。

+0

謝謝Steven,現在我是IOC容器和SimpleInjector的新手。提供的代碼只是試用項目的一部分,以瞭解SimpleInjector細節。但是現在我意識到這種行爲不是特定於實現的,而是爲了防止不確定性 – mamuesstack

相關問題