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
就像 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 发送参数
简答题分两种情况:
如果您想从基本控制器使用 ISomeService
,您必须像这样通过基本构造函数传递该服务:
public class AboutController : BaseController
{
private readonly IAboutService _aboutService;
public AboutController (IAboutService aboutService, ISomeService someService) : base(someService)
{
_aboutService = aboutService;
}
}
如果您不想使用该服务,您可以像这样使用默认的基本构造函数,否则如果您尝试访问它,它将为空:
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
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
就像 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 发送参数
简答题分两种情况:
如果您想从基本控制器使用
ISomeService
,您必须像这样通过基本构造函数传递该服务:public class AboutController : BaseController { private readonly IAboutService _aboutService; public AboutController (IAboutService aboutService, ISomeService someService) : base(someService) { _aboutService = aboutService; } }
如果您不想使用该服务,您可以像这样使用默认的基本构造函数,否则如果您尝试访问它,它将为空:
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