注入Controller的服务类的依赖注入

时间:2011-12-15 17:48:36

标签: asp.net-mvc-3 dependency-injection

我目前正在开发一个使用MVC3的Web应用程序。 MVC3项目通过服务层访问我们的应用程序逻辑。服务层使用通过UnitOfWork模式访问的存储库访问数据库。

我刚刚安装了StructureMap来处理将我的服务注入MVC​​3项目。示例控制器看起来像这样

public class AccountManagementController : Controller
{
    IAccountService accountService;

    public AccountManagementController(IAccountService accountService)
    {
        this.accountService = accountService;
    }

现在,我的问题是我的AccountService类需要在结构图创建时注入UnitOfWork。目前我通过2个控制器处理这个问题。一个接受一个接口,另一个接受实例化具体类。

public class AccountService : IAccountService, IDisposable
{
    private IUnitOfWork unitOfWork;

    internal AccountService(IUnitOfWork unitOfWork)
    {
        this.unitOfWork = unitOfWork;
    }
    public AccountService()
    {
        this.unitOfWork = new UnitOfWork();
    }

这对我来说似乎是代码味道。有没有更正确的方法来处理这个?

谢谢, AFrieze

2 个答案:

答案 0 :(得分:1)

我没有闻到任何东西,只要像评论建议一样,你从AccountService中删除默认的无参数构造函数。任何体面的IoC容器都应该能够级联依赖项,这样当您将IAccountService注入AccountManagementController时,它将解析AccountService对IUnitOfWork的依赖

答案 1 :(得分:1)

正如马克建议我会删除默认构造函数,但是......

AFAIK,StructureMap总是选择具有最多参数的构造函数,因此在解析IUnitOfWork依赖时这不应该是一个问题。

另一方面,IDisposable在我看来像是一种气味。 AFAIK structureMap建议如何处理像这样的一次性实例:

  • 我们应该将一次性服务包装到非一次性服务中 包装。非一次性包装应该配置它的实例 wrapps。
  • 我们应该将一次性服务工厂注入非一次性包装机。

在这两种情况下,我们向消费者注入了直接注入一次性服务的包装纸。

对于structureMap,我们还可以利用嵌套容器功能来跟踪一次性实例。因此,当放置嵌套容器时,将释放所有对象图。