簡體   English   中英

如何通過將 IoC 的名稱用作字符串來動態解析 IoC

[英]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)));

比較

  • 第一種方法允許同時使用多個實現
  • 第一種方法在使用端選擇適當的實現(這就是所謂的服務定位器模式,如果您已經使用 DI,則應盡可能避免使用)
  • 第二種方法只注冊一個實現
  • 第二種方法將注冊邏輯與類型推導邏輯分開

如需更多信息,請訪問溫莎文檔

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM