我已按如下方式设置了一个引导程序:
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")>();
我猜有些东西我不明白,因为这会产生很多语法错误。我在这做错了吗?
答案 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}也是。所以我认为你需要做的就是自动构造函数注入。