控制器中的 IoC 容器实现

IoC container implementation in controller

我想在一种方法中使用 IoC 容器来检查登录用户提交付款时的公司代码。我的设置中有两个证书 class 和一个 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 可以检查凭据,但不会 return 在付款时向 IoC 提交以检查公司代码并应用正确的证书。

当我 运行 信用卡控件包含正确的公司代码时,提交付款方法。

如何根据更新的公司代码让我的申请 select 获得正确的证书。鉴于用户可以根据支付政策 select 设置不同的公司代码。一个公司代码目前可以是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);

如果您正在使用 StructureMap,它会使用 "Greedy Initialization",这意味着当调用构造函数时,它将调用传入最多参数或参数的构造函数。

private IFDGService service;

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

调用IoC.Configure()service可用

在应用程序启动的任何地方调用IoC.Configure()。 google "where does Mvc start" 或类似的东西。

要更改公司代码,请将其设置在控制器中实例变量以外的某个地方,例如 static class,我知道静态不好,让它工作然后让它变得更好,因为修改起来会很复杂,然后在需要时 get; set;

我要去开会,有点仓促,希望对你有帮助