我已经添加了存储库代码并将其调用到HomeController.cs
public class HomeController : Controller
{
private IPlatformRepository _platformRepository;
public HomeController()
{
this._platformRepository = new PlatformRepository(new IoTSimulatordbContext());
}
public HomeController(IPlatformRepository platformRepository )
{
this._platformRepository = platformRepository;
}
以上代码仅适用于PlatformRepository。如果我想添加多个存储库,我可以像下面这样吗?
public class HomeController : Controller
{
private IPlatformRepository _platformRepository;
private IDeviceRepository _deviceRepository;
public HomeController()
{
this._platformRepository = new PlatformRepository(new IoTSimulatordbContext());
this._deviceRepository = new DeviceRepository(new IoTSimulatordbContext());
}
public HomeController(IPlatformRepository platformRepository, IDeviceRepository deviceRepository)
{
this._platformRepository = platformRepository;
this._deviceRepository = deviceRepository;
}
这是正确的方法吗?
public HomeController()
{
this._platformRepository = new PlatformRepository(new IoTSimulatordbContext());
this._deviceRepository = new DeviceRepository(new IoTSimulatordbContext());
}
答案 0 :(得分:1)
是的,可以两次实例化IoTSimulatordbContext。如果您的应用程序变大,您可能会遇到一些错误,因为同一实例在多个地方使用,而不是节省线程。另外,以这种方式管理实例化要求您正确管理实例的处置。
我建议您使用依赖项注入(使用Autofac或Ninject)-这将帮助您管理类实例化并进行处理。因此,您使用DI的构造函数将如下所示
public class HomeController : Controller
{
private readonly IPlatformRepository _platformRepository;
private readonly IDeviceRepository _deviceRepository;
public HomeController(IPlatformRepository platformRepository, IDeviceRepository deviceRepository)
{
this._platformRepository = platformRepository;
this._deviceRepository = deviceRepository;
}
答案 1 :(得分:1)
如果您在询问语法,那么我看不到任何问题...如果您在询问设计和最佳实践,请考虑以下几点:
最好将存储库注入到控制器中,因为初始化存储库不是控制器的考虑...您的代码违反了单一责任原则,因为控制器是承担初始化存储库的额外/不必要的责任。
您的问题中的另一个好处是有关控制器中依赖项的数量。为此,请参考尼古拉的IoC第二定律:see here
任何具有超过3个依赖项的类都应向SRP提出疑问 违反
您的控制器具有2个存储库的依赖项,所以很好...但是,如果您有3个以上的依赖项,则考虑进行重构是一件好事。如果您想知道如何重构存储库,请考虑以下内容:
标识域的Aggregate roots,并为每个聚合根创建一个单一的存储库...因此,实质上,您是在一个存储库中组合相关类型。
您可以将存储库合并为一个更大的块(服务)...现在,高级类(控制器)依赖于您的服务,而服务又依赖于一个或多个存储库。