1

У меня есть интерфейс, и я хочу сделать шаблон фабрики, чтобы создать экземпляр другого конструктора интерфейса. Но я хочу кинуть детали того, какой конструктор должен быть создан в файле конфигурации. Я хотел бы иметь его в форме конфигурации RoleProvider:.NET Конфигурируемая реализация интерфейса

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

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

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

+0

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

+0

@Pauli Østerø: Отредактировано мое сообщение, чтобы уточнить, что я хотел знать. – Kangkan

+0

@Pauli Østerø: Является ли моя реализация чем-то близким к DI? – Kangkan

ответ

1

Добавить объект в Ваш 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(); 
+0

Я не мог понять, как создать метод CreateInstance в CustomMembershipProviderConfigurationSection. Не могли бы вы рассказать? – Kangkan

+0

CustomMembershipProviderConfigurationSection - это класс ... нормальный класс .net, в котором вы можете писать обычные методы. –

0

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

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

+1

MEF не имеет встроенной поддержки для конфигурации XML. –

1

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

некоторых общих DI контейнеров:

Смежные вопросы