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

时间:2017-09-14 23:18:16

标签: c# dependency-injection repository unit-of-work asp.net-mvc-5

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中发送:base时,我可以从中获取数据。但是,我不想将someServiceAboutController等每个控制器发送到BaseController并写入太多代码。

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视图中我仍然希望获得someService的数据而不将参数发送到BaseController

1 个答案:

答案 0 :(得分:1)

简短的回答将分为两种情况:

  1. 如果您想使用基本控制器中的ISomeService,您必须通过基本构造函数传递该服务,如下所示:

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

    public class AboutController : BaseController
    {
       private readonly IAboutService _aboutService;
       public AboutController (IAboutService aboutService)  : base()
       {
           _aboutService = aboutService;
        }
    }
    
  3. 您处于第一个场景中,因此需要通过构造函数传递它才能初始化它!

    但是如果你想打破模式,你会选择其他方式将服务注入基础控制器:

    首先使用自动属性:

    例如:

    public ISomeService SomeService { get; set;}
    

    另一种方法是使用DependecyResolver来获取服务的实例,但这会“破坏”某种方式的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