C# BaseController的重载构造函数未被执行?
当我在基地发送服务时,我可以从中获取数据。但是,我不想从每个控制器向BaseController发送一些服务,比如AboutController,并编写太多代码C# BaseController的重载构造函数未被执行?,c#,dependency-injection,repository,unit-of-work,asp.net-mvc-5,C#,Dependency Injection,Repository,Unit Of Work,Asp.net Mvc 5,当我在基地发送服务时,我可以从中获取数据。但是,我不想从每个控制器向BaseController发送一些服务,比如AboutController,并编写太多代码 public class BaseController : Controller { [Inject] public IUnitOfWork UnitOfWork { get; set; } private readonly ISomeService _someService ; public Base
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()
{
}
}
因此,在AboutController视图中,我仍然希望在不向BaseController发送参数的情况下获取某些服务的数据 如果要从基本控制器使用ISomeService,则必须通过基本构造函数传递该服务,如下所示:
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;
}
}
如果您不想使用该服务,请像这样使用默认的基本构造函数,否则,如果您尝试访问它,它将为null:
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;
}
}
另一种方法是通过使用DependecyResolver获取服务实例,但这会以某种方式“破坏”DI模式,并使测试等变得更加困难。但如果您选择这样做,下面是代码:
public ISomeService SomeService { get; set;}
有关更多信息,请参阅此问题非常感谢您,我使用DependecyResolver完成了这项工作,它现在适合我。但我仍然没有得到用括号括住DI模式的部分。我选择DependencyResolver是为了减少代码,因为我会有太多的控制器,所以我不会将Someservice作为每个控制器的参数发送。在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 >();
}
}