我有一些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是簡約的註冊過程這使我可以添加或刪除服務並保持源代碼的清潔。我的應用程序的初始化可能會很慢(服務器端應用程序),但是當第一個請求到來時,它的行爲必須儘可能快(性能確實對服務響應非常重要)。說初始化我的意思是註冊類型,閱讀配置文件等。
這樣的反射使用會減慢我的應用程序「運行時」還是隻是影響應用程序初始化?將如何解決依賴關係?
如果它只運行一次,它只會影響初始化。就個人而言,我會避免以「服務」結尾的類型,因爲如果有人將它命名爲不同的話?創建一個像AutoRegisterServiceAttribute這樣的自定義屬性,然後將該屬性添加到服務類型中,然後獲取具有該屬性的類型。 –
是的,這是個好主意。我正在使用這種方法,但我想盡可能簡化問題:)問題的根源是信息,反射如何影響應用程序的生命週期。 – Fka
除了加載程序集,我使用了一種技術,我的所有「服務」都繼承了一個接口..例子:'this。綁定(語法=>語法 .FromThisAssembly() .SelectAllClasses() .InheritedFrom() .BindDefaultInterface() .Configure(配置=> config.InRequestScope()));' –