Конфигурируемый интерфейс .NET - PullRequest
1 голос
/ 06 января 2011

У меня есть интерфейс, и я хочу создать фабричный шаблон для создания экземпляра другого разработчика интерфейса. Но я хотел бы указать детали того, какой разработчик будет создан в файле конфигурации. Я хотел бы, чтобы это было в моде конфигурации 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();

И это дает мне результат, который я искал.

Я прошу всех вас оставить отзыв для дальнейшего улучшения.

Ответы [ 3 ]

1 голос
/ 06 января 2011

Добавьте свойство к вашему CustomMembershipProviderConfigurationSection с именем Type, чтобы вы могли настроить его следующим образом в своем конфигурационном файле

<group>
   <MembershipProvider type="... my concrete type" />
</group>

В вашем CustomMembershipProviderConfigurationSection вы создаете метод с именем CreateInstance, который возвращаетIDataExchange.Тело метода довольно простое

public IDataExchange CreateInstance()
{
   var type = Type.GetType(this.Type);
   return (IDataExchange)Activator.CreateInstance(type);
}

, и когда вам нужна ссылка IDataExchange, вы пишете

var config = (CustomMembershipProviderConfigurationSection)ConfigurationManager.GetSection("group/MembershipProvider");
var instance = config.CreateInstance();
1 голос
/ 06 января 2011

Большинство Контейнеры для внедрения зависимостей смогут делать то, что вы просите, благодаря их поддержке XML-конфигурации .

Некоторые распространенные DI-контейнеры:

0 голосов
/ 06 января 2011

Вы должны взглянуть на MEF. Clickity click

Он должен делать именно то, что вы ищете.

...