2

我在 UnitOfWork / Repository / MVC 应用程序上工作。现在这一切都很好,我想将 UnitOfWork 与控制器分离。一种方法是在控制器的构造函数中使用 Ninject(或其他)注入依赖项。但是,这意味着 UnitOfWork 将与控制器同时实例化。

我想使用我的 UnitOfWork 的方式是使用这样的块:

using(var unitOfWork = new IUnitOfWork)
{
    return unitOfWork.GetRepository<IEmployeesRepository>().GetAllEmployees();
}

显然你不能实例化一个接口,你有一个用依赖注入器注入的实现实例,但是我怎样才能在 using 子句中注入它呢?

我看到了属性注入和方法注入,但我不确定如何使用它们来实现我的目标。

4

4 回答 4

2

使用您在容器中注册的工厂:

public class UserController : Controller
{
    IUnitOfWorkFactory _factory;

    public UserController(IUnitOfWorkFactory factory)
    {
        _factory = factory;
    }

    public ActionResult DoSomething()
    {
        using(var unitOfWork = _factory.Create())
        {
            return unitOfWork.GetRepository<IEmployeesRepository>().GetAllEmployees();
        }
    }
}

恕我直言,最好抽象出 UoW 处理:http: //blog.gauffin.org/2012/06/how-to-handle-transactions-in-asp-net-mvc3/

于 2012-10-31T15:51:21.937 回答
1

您可以通过 Autofac 轻松做到这一点。我确信其他 IoC 容器应该具有相同的功能。

这是wiki的链接。

代码示例:

public class UserController : Controller
{
    Func<Owned<IUnitOfWork>> unitOfWorkFactory;

    public UserController(Func<Owned<IUnitOfWork>> unitOfWorkFactory)
    {
        this.unitOfWorkFactory = unitOfWorkFactory;
    }

    public ActionResult DoSomething()
    {
        using(var unitOfWork = this.unitOfWorkFactory().Value)
        {
            return unitOfWork.GetRepository<IEmployeesRepository>().GetAllEmployees();
        }
    }
}

无需额外注册,只需注册接口的实现即可。

于 2012-10-31T16:32:59.447 回答
0

您不必在 using 块中实例化变量,您可以使用现有变量。因此,您可以像这样使用方法注入:

public ActionResult Index(IUnitOfWork unit)
{
    using(unit)
    {
         // Do some work....
    }

    // Return an action
}

请理解,单位将在离开 using 块后被丢弃,因此不应使用它。

于 2012-10-31T15:07:49.597 回答
0

[..] 如何在 using 子句中注入它?

将不再有using条款。如果 IoC 容器注入依赖项,它负责它的生命周期。

using处理依赖项(并且确实这样做)不是一个好习惯。


我看到了属性注入和方法注入

尽可能使用构造函数注入。属性/方法注入在一些特殊情况下有其用途。

构造函数注入的好处是类可以立即清楚地说明它的依赖关系。此外,您只能在提供所有需要的依赖项后创建实例。

使用属性注入,您可能会忘记设置所需的依赖项。仅在依赖项是可选的、具有默认实现或破坏循环依赖图的情况下才使用此选项。

使用方法注入,您可能会一次又一次地使用相同的方法参数使您的代码膨胀。


[...] 如果我想在该控制器的同一个实例中使用 UnitOfWork 两次会发生什么。Ninject 会再次注射吗?

Ninject 将注入同一个实例两次,或者创建两个不同的实例,具体取决于您指示它的行为方式。

IoC 容器允许您为注入的组件指定/配置生命周期样式。对于 Ninject,请参阅如何指定 Object Scopes

于 2012-10-31T15:11:17.417 回答