1

Я столкнулся с ситуацией, когда мой конструктор классов принимает 2 параметра. Один параметр должен быть передан вручную вызывающим объектом, в то время как другой параметр должен быть проиндексирован Structuremap. Я хочу выставить только один конструктор, который принимает значение параметра, которое должно передаваться вручную. Я хочу скрыть второй параметр, так как он должен обрабатываться самой Структурной картой. Может ли кто-нибудь предложить, как это можно сделать.Как использовать Структурную карту для DI, если некоторые параметры конструктора необходимо передать вручную

У меня есть сценарий, как этот

public class ProcessPayments 
{ 
    public ProcessPayments(String accountNumber, IProcessPayments paymentProcesser) 
    { 
     ... 
    } 
} 

Я хочу выставить конструктор только с первым параметром, как так

var P = new ProcessPayments("123"); 

Я хочу Структура Карта автоматически вводить зависимость IProcessPayments для меня на основе моя конфигурация.

Как я могу это достичь?

я могу сделать что-то вроде этого в моем конструкторе

public ProcessPayments(String accountNumber) 
{ 
    _AccountNumber = accountNumber; 
    _ProcessPayments = ObjectFactory.GetInstance<IProcessPayments >(); 
} 

Но это означало бы, что теперь у меня есть зависимость от самой структуры карты и мне не нравится этот вариант. Любое другое элегантное решение?

ответ

1

Кажется, что accountNumber - это зависимость/значение времени выполнения (оно может меняться от вызова к вызову). Не смешивайте значения времени выполнения с зависимостями времени компиляции/регистрации. Вместо того, чтобы передать accountNumber на использовании метода:

public class ProcessPayments 
{ 
    public ProcessPayments(IProcessPayments paymentProcesser) { ... } 

    public void Process(String accountNumber) { ... } 
} 

Или, если это не подходит, создать фабрику:

public class ProcessPaymentsFactory : IProcessPaymentsFactory 
{ 
    public ProcessPaymentsFactory(IProcessPayments paymentProcesser) { ... } 

    public ProcessPayments Create(String accountNumber) 
    { 
     return new ProcessPayments(accountNumber, this.paymentProcesser); 
    } 
} 
+0

Стивен ваш ответ имеет смысл для меня, однако в моем нынешнем случае я прохождения параметр, взятый из конструктора, в конструктор базового класса. Я думаю, я могу изменить базовый класс, чтобы принимать параметр в методе, а не в конструктор. В противном случае я могу использовать завод. Ваш ответ имеет смысл. Благодаря! –

+0

Steven У меня есть один маленький связанный вопрос, на который я хочу, чтобы вы ответили, поэтому я не отправляю его снова. Я считаю, что если объект нуждается в некоторой ценности для выполнения своих функций, он должен быть раскрыт в конструкторе. Например, если, например, существует класс, который получает данные json из некоторого URL-адреса, возможно, URL-адрес должен быть задан с помощью конструктора. Ваш ответ заставил меня думать, является ли этот подход правильным или нет? Plz дает вам ценные отзывы. –

+1

@AfrazAli: В этом примере URL-адрес выглядит как значение конфигурации. Это не изменится в течение срока действия приложения. Вы передадите это через конструктор. – Steven

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