上面我的問題仍然有效,但以下可能會幫助你的好意。
Funq不支持自動構造函數注入(a.k.a.自動佈線),您將不得不通過構造Func<T>
lambda表達式來手動執行此操作。因爲您已經手動進行構造函數注入,所以很容易選擇您希望注入到服務中的什麼IDbConnectionFactory
。例如:
IDbConnectionFactory yellowDbConFactory =
new YellowDbConnectionFactory();
IDbConnectionFactory blueDbConFactory =
new BlueDbConnectionFactory();
IDbConnectionFactory purpleDbConFactory =
new PurpleDbConnectionFactory();
container.Register<IService1>(c =>
new Service1Impl(yellowDbConFactory,
c.Resolve<IDep1>());
container.Register<IService2>(c =>
new Service2Impl(blueDbConFactory);
container.Register<IService3>(c =>
new Service3Impl(purpleDbConFactory,
c.Resolve<IDep2>());
當然,你也可以將舊命名註冊,就像這樣:
container.Register<IDbConnectionFactory>("yellow",
new YellowDbConnectionFactory());
container.Register<IDbConnectionFactory>("blue",
new BlueDbConnectionFactory());
container.Register<IDbConnectionFactory>("purple",
new PurpleDbConnectionFactory());
container.Register<IService1>(c =>
new Service1Impl(
c.Resolve<IDbConnectionFactory>("yellow"),
c.Resolve<IDep1>());
container.Register<IService2>(c =>
new Service2Impl(
c.Resolve<IDbConnectionFactory>("blue"));
container.Register<IService3>(c =>
new Service3Impl(
c.Resolve<IDbConnectionFactory>("purple"),
c.Resolve<IDep2>());
由於缺乏對自動裝配支持的,你最終會與這些比較尷尬註冊,這很快就會導致構建根目錄的維護噩夢,但這與您的問題無關;-)
您通常應該儘量避免註冊時出現歧義。在你的情況下,你有一個單一的接口,它做兩件事(連接到兩個數據庫)。除非這兩個數據庫共享完全相同的模型中,每個數據庫應該得到自己的接口(如果這兩個實現並不互換,你會違反Liskov substitution principle):
interface IYellowDbConnectionFactory : IDbConnectionFactory
{
}
interface IPurpleDbConnectionFactory : IDbConnectionFactory
{
}
因爲這樣ServiceStack作品,你可能需要實現每個實現:
class YellowDbConnectionFactory : OrmLiteConnectionFactory,
IYellowDbConnectionFactory
{
public YellowDbConnectionFactory(string s) : base(s){}
}
class PurpleDbConnectionFactory : OrmLiteConnectionFactory,
IPurpleDbConnectionFactory
{
public YellowDbConnectionFactory(string s) : base(s){}
}
現在,你應該改變你的服務的定義中使用的,而不是使用IDbConnectionFactory
具體接口:
public class MovieService : RestServiceBase<Movie>
{
private readonly IYellowDbConnectionFactory dbFactory;
public MovieService(IYellowDbConnectionFactory factory)
{
this.dbFactory = factory;
}
}
請注意,此類現在使用構造函數注入而不是屬性注入。你可以使用這個來處理屬性注入,但通常使用構造函數注入更好。這是關於它的SO question。
隨着Funq,你的配置然後將這個樣子:
container.Register<MovieService>(c =>
new MovieService(
c.Resolve<IYellowDbConnectionFactory>());
這兩個新的接口和兩個類並切換到MovieService
沒贏你很多,因爲Funq不支持自動接線。你將是一個手動將所有東西連接在一起的人。但是,當您切換到確實支持自動佈線的框架時,此設計允許容器注入正確的依賴關係而沒有問題,因爲沒有關於要注入什麼的討論。
你能顯示一些代碼嗎?我想我們可以給你一些關於你的應用程序設計的提示,但爲此,我們需要更多的實際設計見解。看看在哪些服務中注入了這些IDbConnectionFactory實例,以及這些服務如何處理這些IDbConnectionFactory依賴關係會很有趣。 – Steven 2012-01-07 00:23:25
但請注意,Funq是一個非常簡單的IoC容器(有些甚至可能認爲它不是IoC容器),而且所有東西都必須通過手工連接。但是,您可以在創建的每項服務中注入所需的一切。 – Steven 2012-01-07 00:25:55
我更新了這個問題,使其更加清晰,並在Simple Injector上找到了您的文章。我希望通過現在的閱讀來加深對IoC的理解。 – 2012-01-07 03:24:33