У меня есть интерфейс, и я хочу создать фабричный шаблон для создания экземпляра другого разработчика интерфейса. Но я хотел бы указать детали того, какой разработчик будет создан в файле конфигурации. Я хотел бы, чтобы это было в моде конфигурации RoleProvider:
<section name="MembershipProvider" type="MyOwn.UserManagement.Providers.MembershipProvider.CustomMembershipProviderConfigurationSection,MyOwn.UserManagement.Providers.MembershipProvider" allowDefinition="MachineToApplication" />
Так что это своего рода техника внедрения зависимостей. Кто-нибудь может мне помочь?
Edit:
Фактическая ситуация такова:
У меня есть интерфейс IDataExchange
и я хочу реализовать его с разными сборками для разных клиентов. Поэтому у меня может быть две сборки, в которых есть классы, реализующие IDataExchange
, скажем, DataExchange1
и DataExchange2
. Теперь, когда я развертываю, в зависимости от того, для какого клиента я его предоставляю, я хочу указать детали сборки (DataExchange1
или DataExchange2
) в файле конфигурации. Это также позволит мне или любому разработчику написать новые сборки, реализующие IDataExchange
для любого требуемого изменения, если решение об экземпляре будет обработано автоматически.
Так как я могу это сделать?
Моя реализация:
Спасибо всем вам. И особая благодарность @ Pauli Østerø
Я учел ваши ответы и нашел решение.
В конфигурационном файле я добавил следующее:
<add key="Exchanger" value="DExchanger.DExchange1, DExchanger.DExchange1"/>
Я добавил класс (для работы в качестве DI-контейнера или абстрактной фабрики). Класс DIContainer
содержит следующий метод:
public IDataExchange CreateInstance(string config)
{
var type = Type.GetType(config);
return (IDataExchange)Activator.CreateInstance(type);
}
И пока я создаю экземпляр, я пишу следующее:
var config = ConfigurationManager.AppSettings.Get("Exchanger");
DIContainer x = new DIContainer();
var instance = x.CreateInstance(config);
Console.Write("Provide your input please: ");
string inp=Console.ReadLine();
Console.WriteLine(instance.DoDataExchange(inp));
Console.ReadLine();
И это дает мне результат, который я искал.
Я прошу всех вас оставить отзыв для дальнейшего улучшения.