Реализация контейнера IoC в контроллере

Я хочу использовать контейнер IoC в методе, чтобы проверять зарегистрированную учетную запись пользователя при отправке платежа. У меня есть два сертификата в моем классе настроек и оператор IF else, чтобы различать каждый из них.

      public static string FDGCreditCardUserID
    {
        get
        {
            if (BillingController.currentcompanycode == 5)
                return ConfigurationManager.AppSettings["5FDGCreditCardUserID"];
            else
                return ConfigurationManager.AppSettings["6FDGCreditCardUserID"];
        }
    }
    public static string FDGCreditCardPassword
    {
        get
        {
            if (BillingController.currentcompanycode == 5)
                return ConfigurationManager.AppSettings["5FDGCreditCardPassword"];
            else
                return ConfigurationManager.AppSettings["6FDGCreditCardPassword"];
        }
    } 

Тогда в моем контейнере IoC

  x.For<IFDGService>().Use<FDGService>().SetProperty(s =>
            {
                s.Url = Settings.FDGURL;
                s.UserID = Settings.FDGCreditCardUserID;
                s.Password = Settings.FDGCreditCardPassword;
                s.Certificate = Settings.FDGCreditCardCertFilePath;  
            });

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

Метод SubmitPayment, когда элемент управления кредитной карты содержит правильный балансовый код, когда я его запускаю.

Как мне получить заявку, чтобы выбрать правильный сертификат на основе обновленной балансовой единицы. Видя, как пользователи могут иметь разные балансовые единицы в зависимости от политики, выбранной для оплаты. Одна балансовая единица на данный момент может быть 5 или 6.

  public ActionResult SubmitPayment([ConvertJSON]List<PayModel> payments)
    {  
        List<TransactionModel> transactions = new List<TransactionModel>();
        foreach (var pymt in payments)
        {
            var policyNumber = pymt.PolicyNumber.Trim();
            TransactionModel trans = new TransactionModel() { Payment = pymt };

            if (pymt.Selected)
            {
                var creditCardControl = UpdateCreditCardControl(policyNumber);

1 ответ

Решение

Если вы используете StructureMap, он использует "Жадную инициализацию", то есть при вызове конструктора он вызывает конструктор с наибольшим количеством переданных аргументов или параметров.

private IFDGService service;

public MyController(IFDGService service)
{
    this.service = service;
}

затем service будет доступно после IoC.Configure() называется.

Вызов IoC.Configure() везде, где запущено приложение. Google "где Mvc начинается" или что-то в этом роде.

чтобы изменить балансовую единицу, установите его где-нибудь, кроме переменной экземпляра в контроллере, как static класс, я знаю, что статический плохо, заставить его работать, а затем сделать его лучше, так как это было бы сложно изменить, а затем get; set; когда вам нужно.

Я должен идти на встречу, вроде торопился, надеюсь, что это помогает

Другие вопросы по тегам