2015-09-28 77 views
1

我有一些IoC容器(哪一個並不重要,但讓我們假設它是Autofac)。在我的解決方案中,我有超過30個需要註冊的服務。所有服務位於名爲服務的同一個程序集中,每個類的名稱格式爲{specific_name} Service.cs反射vs參考 - IoC容器註冊

我想,以避免由於某些原因這種方式手動註冊每個服務:

container.Register<OneService>().AsSelf(); 
container.Register<TwoService>().AsSelf(); 
... 
container.Register<ThirtyFourService>().AsSelf(); 

並以這種方式註冊我的類型:

Type[] serviceTypes = Assembly.Load("Services") 
         .GetTypes() 
         .Where(t => t.Name.EndsWith("Service")) 
         .ToList(); 

foreach(Type serviceType in serviceTypes) 
{ 
    container.Register(serviceType).AsSelf(); 
} 

所有我想要的achive是簡約的註冊過程這使我可以添加或刪除服務並保持源代碼的清潔。我的應用程序的初始化可能會很慢(服務器端應用程序),但是當第一個請求到來時,它的行爲必須儘可能快(性能確實對服務響應非常重要)。說初始化我的意思是註冊類型,閱讀配置文件等。

這樣的反射使用會減慢我的應用程序「運行時」還是隻是影響應用程序初始化?將如何解決依賴關係?

+3

如果它只運行一次,它只會影響初始化。就個人而言,我會避免以「服務」結尾的類型,因爲如果有人將它命名爲不同的話?創建一個像AutoRegisterServiceAttribute這樣的自定義屬性,然後將該屬性添加到服務類型中,然後獲取具有該屬性的類型。 –

+0

是的,這是個好主意。我正在使用這種方法,但我想盡可能簡化問題:)問題的根源是信息,反射如何影響應用程序的生命週期。 – Fka

+0

除了加載程序集,我使用了一種技術,我的所有「服務」都繼承了一個接口..例子:'this。綁定(語法=>語法 .FromThisAssembly() .SelectAllClasses() .InheritedFrom () .BindDefaultInterface() .Configure(配置=> config.InRequestScope()));' –

回答

0

在AutoFac,有兩種方法來控制你的請求的生命週期:InstancePerHttpRequestInstancePerApiRequest

但是,如果您使用InstancePerHttpRequest或InstancePerApiRequest它將基本上是相同的事情,您將需要爲您的類的所有服務解析並註冊它們。我不認爲這會讓你的應用程序更加昂貴,因爲一些擴展正在做同樣的事情。例如。 AutoFac像MVC 5的AutoFac或Web Api的Autofac。

所以,如果你不關心幾毫秒的性能,你可以去找它。

0

我會想象它仍然使用Activator.CreateInstance爲每個服務,所以有一個輕微的打擊,以及明顯的反射發現服務。從容器的角度來看,我認爲你不需要擔心性能方面的問題。如果出於某種原因遇到問題,請檢查另一個容器以獲得更好的性能,因爲這是常見用例,應該得到相當好的支持。

1

假設您一旦註冊,將不會對請求產生影響 - 兩種註冊方式(.Register<TwoService>().AsSelf()和本質上.Register(typeof(TwoService)).AsSelf())都應該完全相同。你可以檢查你自己選擇的容器,然後再簡單地調用另一個容器。

請注意,根據您使用的容器,可能存在註冊「所有類型匹配模式」的方法。即Unity已經「註冊」了所有類型 - 所以根本不需要Register<ConcreteType>()