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
时,我可以从中获取数据。但是,我不想将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视图中我仍然希望获得someService的数据而不将参数发送到BaseController
答案 0 :(得分:1)
简短的回答将分为两种情况:
如果您想使用基本控制器中的ISomeService
,您必须通过基本构造函数传递该服务,如下所示:
public class AboutController : BaseController
{
private readonly IAboutService _aboutService;
public AboutController (IAboutService aboutService, ISomeService someService) : base(someService)
{
_aboutService = aboutService;
}
}
如果您不想使用该服务,请使用默认的基本构造函数,否则如果您尝试访问它,它将为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