我目前正在开发一个使用MVC3的Web应用程序。 MVC3项目通过服务层访问我们的应用程序逻辑。服务层使用通过UnitOfWork模式访问的存储库访问数据库。
我刚刚安装了StructureMap来处理将我的服务注入MVC3项目。示例控制器看起来像这样
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
答案 0 :(得分:1)
我没有闻到任何东西,只要像评论建议一样,你从AccountService中删除默认的无参数构造函数。任何体面的IoC容器都应该能够级联依赖项,这样当您将IAccountService注入AccountManagementController时,它将解析AccountService对IUnitOfWork的依赖
答案 1 :(得分:1)
正如马克建议我会删除默认构造函数,但是......
AFAIK,StructureMap总是选择具有最多参数的构造函数,因此在解析IUnitOfWork依赖时这不应该是一个问题。
另一方面,IDisposable在我看来像是一种气味。 AFAIK structureMap建议如何处理像这样的一次性实例:
在这两种情况下,我们向消费者注入了直接注入一次性服务的包装纸。
对于structureMap,我们还可以利用嵌套容器功能来跟踪一次性实例。因此,当放置嵌套容器时,将释放所有对象图。