2011-12-15 211 views
3

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

我刚刚安装了StructureMap来负责将我的服务注入到MVC3项目中。一个例子控制器会看起来像这样

public class AccountManagementController : Controller 
{ 
    IAccountService accountService; 

    public AccountManagementController(IAccountService accountService) 
    { 
     this.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

+4

删除默认的构造函数 – 2011-12-15 17:57:35

回答

1

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

AFAIK,StructureMap总是选择参数最多的构造函数,所以这在解决IUnitOfWork依赖性时不应该成为问题。

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

  • 我们应该换一次性服务到非一次性 包装。非一次性包装物应配置其包装的实例 。
  • 我们应该将一次性服务的工厂注入非一次性包装。

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

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

1

我不只要闻不到,这样的评论暗示,你从帐户服务中删除默认参数的构造函数。任何像样的IoC容器应能级联依赖,这样,当你注入IAccountService到AccountManagementController,它会解决的AccountService对IUnitOfWork