如何将Unity设置为依赖注入存储库到我的服务层?

时间:2011-12-23 09:13:08

标签: c# asp.net-mvc asp.net-mvc-3 unity-container

我已按如下方式设置了一个引导程序:

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();
        container.RegisterType<IService<Account>, AccountService>();
        container.RegisterControllers();           
        return container;
    }

我的控制器看起来像这样:

    public AccountsController(IService<Account> accountService) {
        _account = accountService;
    }

调用它时,会从accountService正确设置_account,如下所示:

public class AccountService : BaseService, IService<Account>
{
    public AccountService() { base.Initialize();
        _accountRepository = StorageHelper.GetTable<Account>();
        _productRepository = StorageHelper.GetTable<Product>(); 
}

您可以在此处看到AccountService依赖于设置两个存储库。在Unity中有一些方法我也可以指定这种依赖,所以我不需要在StorageHelper.GetTable()中编写代码;

更新

我在以下建议后添加了以下代码:

 public AccountService(
            IAzureTable<Account> accountRepository, 
            IAzureTable<Product> productRepository) { 
            //base.Initialize(); 
            _accountRepository = accountRepository; 
            _productRepository = productRepository;  
        } 

这是原始代码:

   public static IAzureTable<T> GetTable<T>() where T : TableServiceEntity
    {
        return new AzureTable<T>(GetStorageAccount(), TableNames[typeof(T)]);
    }

然后尝试在引导程序中设置这些类型,如下所示:

 container.RegisterType<IAzureTable<Account>, AzureTable<Account>(GetStorageAccount(), "TestAccounts")>();
 container.RegisterType<IAzureTable<Product>, AzureTable<Product>(GetStorageAccount(), "TestProducts")>();

我猜有些东西我不明白,因为这会产生很多语法错误。我在这做错了吗?

2 个答案:

答案 0 :(得分:2)

是的,将这两个存储库视为构造函数参数,Unity将根据您的引导程序中的指定将它们连接起来:

public class AccountService : BaseService, IService<Account> 
{ 
    public AccountService(StorageHelperType accountRepo, StorageHelperType productRepo) { base.Initialize(); 
        _accountRepository = accountRepo; 
        _productRepository = productRepo;  
} 

在你的引导程序中,你应该能够指定使用InjectionConstructor获得这些参数的确切位置(一个很好的例子here)(假设它们是不同的类型,如果它们是不同的类型,你可以直接连接它们up和Unity会把它们排除在外。)

编辑新信息

当您使用Unity注册泛型类型时,请将它们包装在TypeOf语句中,因为这似乎是您使用Unity来解决泛型的问题(来源:MSDN

答案 1 :(得分:1)

我在我的MVC3应用程序中使用Castle Windsor进行依赖注入,但我认为Unity的工作方式大致相同。我基于this blog post建立了依赖注入。您可以看到他创建了自己的WindsorControllerFactory,而不是使用默认的控制器工厂,它会自动注入依赖项。

经过一些谷歌搜索后,我确实找到了一些关于在MVC3中使用Unity的博文,如this [1]this[2]this[3],他们似乎都在创建{{1}也是。所以我认为你需要做的就是自动构造函数注入。