BaseController 的重载构造函数没有被执行?

BaseController's overloaded constructor not being executed?

public class BaseController : Controller
{
    [Inject]
    public IUnitOfWork UnitOfWork { get; set; }
    private readonly ISomeService _someService ;

    public BaseController(ISomeService someService)
    {
        _someService = someService;
    }

    public void Contacts()
    {
        contacts = _someService .GetById(1);
        ViewBag.someThing = contacts; //Add whatever
    }

    public BaseController()
    {

    }
}

当我在 :base 中发送 someService 时,我可以从中获取数据。但是我不想从每个控制器发送 someService 就像 AboutControllerBaseController 并写太多代码。

public class HomeController : BaseController
{

    private readonly ISomeService someService;

    public HomeController(ISomeService someService) : base(someService)
    {
        _someService = someService;
    }
}

public class AboutController : BaseController
{
    private readonly IAboutService _aboutService;
    public AboutController (IAboutService aboutService) 
    {
        _aboutService = aboutService;
    }
}

所以在 AboutController 视图中我仍然想获取一些服务的数据而不向 BaseController 发送参数

简答题分两种情况:

  1. 如果您想从基本控制器使用 ISomeService,您必须像这样通过基本构造函数传递该服务:

    public class AboutController : BaseController
    {
         private readonly IAboutService _aboutService;
         public AboutController (IAboutService aboutService, ISomeService someService)  : base(someService)
         {
             _aboutService = aboutService;
         }
    }
    
  2. 如果您不想使用该服务,您可以像这样使用默认的基本构造函数,否则如果您尝试访问它,它将为空:

    public class AboutController : BaseController
    {
       private readonly IAboutService _aboutService;
       public AboutController (IAboutService aboutService)  : base()
       {
           _aboutService = aboutService;
        }
    }
    

您属于第一种情况,需要通过构造函数传递给它进行初始化!

但是如果您想打破这种模式,您可以选择其他方式将服务注入到您的基本控制器中:

第一个使用自动属性:

例如:

public ISomeService SomeService { get; set;}

另一种方法是使用 DependecyResolver 获取服务实例,但这会 'break' 以某种方式成为 DI 模式,并且会使测试等变得更加困难。但是如果您选择这样做这是代码:

  public class BaseController : Controller
  {
     [Inject]
     public IUnitOfWork UnitOfWork { get; set; }
     private readonly ISomeService _someService ;

     public BaseController(ISomeService someService)
     {
         _someService = someService;
     }

     public void Contacts()
     {
         contacts = _someService .GetById(1);
         ViewBag.someThing = contacts; //Add whatever
     }

     public BaseController()
     {
          _someService = DependencyResolver.Current.GetService<ISomeService >();
     }
}

有关更多信息,请参阅此问题 here