Я бы предположил, что вы используете Виндзорский замок в качестве контейнера 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
Для получения дополнительной информации пожалуйста, посетите Виндзорскую документацию