Как разрешить Io C динамически, используя его имя в качестве строки - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть несколько реализаций для одного и того же интерфейса, как показано в примере ниже

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>());

Ответы [ 3 ]

1 голос
/ 14 апреля 2020

Я бы предположил, что вы используете Виндзорский замок в качестве контейнера DI на основе предоставленного примера кода.

Я вижу как минимум две разные опции:
1) Регистрация Все и используйте только соответствующий

container.Register(
   Component.For<OrganizationServiceCore.IOrganizationService>()
     .ImplementedBy<SchoolServiceCore.SchoolsProvider.SchoolService>(),
   Component.For<OrganizationServiceCore.IOrganizationService>()
     .ImplementedBy<CompanyServiceCore.CompanyProvider.CompanyService>());

В этом случае победит первый. Но если вы также вызываете функцию Named builder во время регистрации службы, вы можете разрешить соответствующую функцию по ее имени.

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) Зарегистрируйте только ОДНО необходимое
В этом случае вам следует использовать функцию UsingFactoryMethod builder для делегирования процесса создания соответствующей реализации сервиса.

 container.Register(
     Component.For<OrganizationServiceCore.IOrganizationService>()
        .UsingFactoryMethod(
          () => OrganizationServiceFactory.CreateService(serviceNameSetting)));

Сравнение

  • Первый подход позволяет использовать несколько реализаций одновременно
  • Первый подход выбирает подходящую реализацию на стороне использования (это так называемый шаблон Service Locator, которого следует по возможности избегать, если вы используете DI уже)
  • Второй подход регистрирует только одну реализацию
  • Второй подход отделяет регистрационные логики c от логики вычетов типа c

Для получения дополнительной информации пожалуйста, посетите Виндзорскую документацию

1 голос
/ 14 апреля 2020

Вы можете попробовать использовать

string serviceName= "CompanyServiceCore.CompanyProvider.CompanyService";
Type myType= Type.GetType(serviceName);
container.Register(Component.For<OrganizationServiceCore.IOrganizationService>().ImplementedBy<myType>());

и использовать его для регистрации вашего типа в контейнере Io C.

0 голосов
/ 20 апреля 2020
     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 в зависимости от необходимого значения.

не забудьте добавить ссылку на проект в том месте, где вы хотите его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...