[英]How to resolve IoC dynamically by using it's name as string
我對同一個接口有多個實現,如下例所示
container.Register(Component.For<OrganizationServiceCore.IOrganizationService>().ImplementedBy<SchoolServiceCore.SchoolsProvider.SchoolService>());
或者
container.Register(Component.For<OrganizationServiceCore.IOrganizationService>().ImplementedBy<CompanyServiceCore.CompanyProvider.CompanyService>());
解析必須依賴於數據庫中的一個值,我將從數據庫中獲取值作為字符串“SchoolServiceCore.SchoolsProvider.SchoolService”或“CompanyServiceCore.CompanyProvider.CompanyService”
我如何使用它,如下例所示:
string serviceName= "CompanyServiceCore.CompanyProvider.CompanyService";
container.Register(Component.For<OrganizationServiceCore.IOrganizationService>().ImplementedBy<serviceName>());
您可以嘗試使用
string serviceName= "CompanyServiceCore.CompanyProvider.CompanyService";
Type myType= Type.GetType(serviceName);
container.Register(Component.For<OrganizationServiceCore.IOrganizationService>().ImplementedBy<myType>());
並使用它在 IoC 容器中注冊您的類型。
根據提供的示例代碼,我假設您使用Windsor Castle作為您的 DI 容器。
我可以看到至少兩個不同的選項:
1)全部注冊並只使用適當的一個
container.Register(
Component.For<OrganizationServiceCore.IOrganizationService>()
.ImplementedBy<SchoolServiceCore.SchoolsProvider.SchoolService>(),
Component.For<OrganizationServiceCore.IOrganizationService>()
.ImplementedBy<CompanyServiceCore.CompanyProvider.CompanyService>());
在這種情況下,第一個將獲勝。 但是,如果您在服務注冊期間也調用Named
構建器 function,那么您可以通過其名稱解析相應的構建器。
container.Register(
Component.For<OrganizationServiceCore.IOrganizationService>()
.Named("SchoolService")
.ImplementedBy<SchoolServiceCore.SchoolsProvider.SchoolService>(),
Component.For<OrganizationServiceCore.IOrganizationService>()
.Named("CompanyService")
.ImplementedBy<CompanyServiceCore.CompanyProvider.CompanyService>());
...
IOrganizationService svc = container.Resolve<IOrganizationService>("SchoolService");
2) 只注冊需要的 ONE
在這種情況下,您應該使用UsingFactoryMethod
構建器 function 來委派相應服務實現的創建過程。
container.Register(
Component.For<OrganizationServiceCore.IOrganizationService>()
.UsingFactoryMethod(
() => OrganizationServiceFactory.CreateService(serviceNameSetting)));
比較
如需更多信息,請訪問溫莎文檔
var assemblyName = "CompanyServiceCore.CompanyProvider";
var serviceName = "CompanyService";
System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(assemblyName);
var service = assembly.GetTypes().Where(p =>
p.FullName == assemblyName+"."+serviceName
).FirstOrDefault();
container.Register(Component.For<OrganizationServiceCore.IOrganizationService>().ImplementedBy(service));
您可以根據需要的值更改 assemblyName 和 serviceName 變量。
不要忘記在您要使用它的地方添加項目引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.