代码之家  ›  专栏  ›  技术社区  ›  Maho

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

  •  0
  • Maho  · 技术社区  · 7 年前
    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 我可以从中获取数据。但是我不想发送 来自每个控制器,如 AboutController 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视图中,我仍然希望在不向BaseController发送参数的情况下获取一些服务的数据

    1 回复  |  直到 7 年前
        1
  •  1
  •   Rey    7 年前

    简短答案将分为两种情况:

    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;
          }
      }
      

    您处于第一个场景中,因此需要将其通过构造函数进行初始化!

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

    第一个是使用自动属性:

    例如:

    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