【问题标题】:.NET MVC Service layer constructor.NET MVC 服务层构造函数
【发布时间】:2014-08-01 04:57:25
【问题描述】:

我对如何在服务中实现我的构造函数很感兴趣。我对 .NET 有点陌生,所以如果问题太琐碎,请不要误会我的意思。

这是我当前的构造函数,但我想完全理解(因为它看起来可以工作,所以我从某个地方获取了代码)

   // initialize UnitOfWork
    private IUnitOfWork _unitOfWork;

    public TownService()
        : this(new UnitOfWork())
    {
    }

    public TownService(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

: this 是什么意思,先调用哪个?我还看到有: base 的构造函数,但我认为那是第一个调用superclass 的构造函数。

我需要打电话给新的UnitOfWork() 吗? UnitOfWork 不应该是 factory (共享)实例吗?或者它是factory 和新的UnitOfWork 不是创建新的而是从内存中获取初始化的?

谢谢。

【问题讨论】:

  • :this(new UnitOfWork()) 表示它使用 IUnitOfWork 接口参数调用构造函数。首先调用哪个,取决于上下文。对于这个问题,也许首先阅读依赖注入。
  • 感谢您指出这一点,刚刚发现我有一些 DI 书 :D

标签: asp.net-mvc constructor repository-pattern unit-of-work service-layer


【解决方案1】:

C# 中的构造函数

给定你的代码

public TownService()
    : this(new UnitOfWork())
{
  //1
}

public TownService(IUnitOfWork unitOfWork)
{
    //2
    _unitOfWork = unitOfWork;
}

调用new TownService()

  • 调用无参数构造函数
  • 实例化一个新的UnitOfWork 并调用重载TownService(IUnitOfWork unitOfWork),所以 //2 被执行。发生这种情况是因为 this(...) 调用。
  • 然后执行无参构造函数体,即 //1

您需要从 somewhere 获取 IUnitOfWork 的实例,但调用无参数构造函数将实例化一个新的 UnitOfWork 可能不是您想要的 - 它并没有真正购买你有很大的灵活性。

使用工厂

如果你想使用工厂,你会去类似

ITownService s = new TownService(myFactory.Get<IUnitOfWork>());

因此避免了无参数构造函数。

使用 IoC

如果你想使用 IoC 容器,你可能会像这样来配置你的容器

myContainer.Register<IUnitOfWork, UnitOfWork>(); //May need to provide database transaction or whatever
myContainer.Register<ITownService, TownService>();

您还需要告诉 ASP.NET MVC 在创建控制器时使用容器。您可以通过创建一个知道您的 IoC 容器的ControllerFactory 来做到这一点。大多数 IoC 容器都带有这样的工厂以及如何使用它的说明。

完成后,您就可以像这样声明控制器了

public class MyController
{
    public MyController(ITownService townService) 
    {
      /*...*/
    }
}

让 ASP.NET MVC 和您的 IoC 容器完成剩下的工作。

【讨论】:

  • 其实我有你刚刚写的第一个和最后一个代码块......并且使用 ninject 我有这个: private static void RegisterServices(IKernel kernel) { kernel.Bind().To (); kernel.Bind().To(); kernel.Bind().To(); kernel.Bind().To(); kernel.Bind().To(); }
  • 这样就够了,还是我应该添加/删除一些代码?
  • 嗯,它有效吗?如果您还没有告诉 ASP.NET MVC 有关 Ninject 的信息,您可能还没有这样做。只需 google ninject 和 mvc。
  • 看起来确实如此,尽管我认为(如您所说) public TownService() : this(new UnitOfWork()) { //1 } 是我不需要的代码...只是对那些构造函数来完全理解它们。没有它会调用 //2 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多