【发布时间】:2014-09-02 19:52:09
【问题描述】:
我将在这个问题的开头声明:我知道以下是糟糕的设计,但重构目前不是一种选择,理想情况下应该使用拦截器来完成。
我正在努力将城堡从 1.6(我认为)升级到 3.3,不幸的是这涉及到一些语法更改,我现在已经编译了所有内容,但是我围绕服务容器的一些测试不起作用。
我有一个存储库,它有几个实现来提供不同的功能,该存储库只用于内联所有不同的实现,这里是代码的基础:
温莎城堡注册:
RepositoryRegistration<IAccountRepository, AccountRepositoryFeedEntryDecorator>()
.DependsOn(Dependency.OnComponent("decoratedRepository", typeof(AccountRepositoryAuthorizationDecorator))),
RepositoryRegistration<AccountRepositoryAuthorizationDecorator>()
.DependsOn(Dependency.OnComponent("decoratedRepository", typeof(AccountRepositoryMaskingDecorator))),
RepositoryRegistration<AccountRepositoryMaskingDecorator>()
.DependsOn(Dependency.OnComponent("decoratedRepository", typeof(AccountRepository))),
RepositoryRegistration<AccountRepository>());
RepositoryRegistration 方法:
private static ComponentRegistration<TRepository> RepositoryRegistration<TRepository, TConcreteRepository>()
where TConcreteRepository : TRepository where TRepository : class
{
return Component
.For<TRepository>()
.ImplementedBy<TConcreteRepository>()
.Named(typeof(TConcreteRepository).Name);
}
基本接口:
public interface IAccountRepository
{
string Create(Account account);
void Update(Account account);
Account Get(string accountId);
}
实现:
public class AccountRepositoryFeedEntryDecorator : IAccountRepository
{
private readonly IAccountRepository decoratedRepository;
public AccountRepositoryFeedEntryDecorator(
IAccountRepository decoratedRepository)
{
this.decoratedRepository = decoratedRepository;
}
string Create(Account account)
{
//Add Entry To Feed
return decoratedRepository.Create(account);
};
void Update(Account account)
{
//Add Entry To Feed
return decoratedRepository.Udpate(account);
}
Account Get(string accountId);
{
//Add Entry To Feed
return decoratedRepository.Get(accountId);
}
}
public class AccountRepositoryAuthorizationDecorator : IAccountRepository
{
private readonly IAccountRepository decoratedRepository;
public AccountRepositoryAuthorizationDecorator(
IAccountRepository decoratedRepository)
{
this.decoratedRepository = decoratedRepository;
}
string Create(Account account)
{
//Ensure User Is Authorized
return decoratedRepository.Create(account);
};
void Update(Account account)
{
//Ensure User Is Authorized
return decoratedRepository.Udpate(account);
}
Account Get(string accountId);
{
//Ensure User Is Authorized
return decoratedRepository.Get(accountId);
}
}
public class AccountRepositoryMaskingDecorator : IAccountRepository
{
private readonly IAccountRepository decoratedRepository;
public AccountRepositoryMaskingDecorator(
IAccountRepository decoratedRepository)
{
this.decoratedRepository = decoratedRepository;
}
string Create(Account account)
{
//Mask Sensitive Information
return decoratedRepository.Create(account);
};
void Update(Account account)
{
//Mask Sensitive Information
return decoratedRepository.Udpate(account);
}
Account Get(string accountId);
{
//Mask Sensitive Information
return decoratedRepository.Get(accountId);
}
}
public class AccountRepository : IAccountRepository
{
string Create(Account account)
{
//Create account and return details
};
void Update(Account account)
{
//Update account and return details
}
Account Get(string accountId);
{
//Return Account
}
}
最后这是我在测试中遇到的错误:
Castle.MicroKernel.Handlers.HandlerException : 无法创建组件“AccountRepositoryFeedEntryDecorator”,因为它需要满足依赖关系。
'AccountRepositoryFeedEntryDecorator' 正在等待以下依赖项: - 已注册但也在等待依赖项的组件“Shaw.Services.CustomerManagement.Host.Repositories.Sql.Decorators.AccountRepositoryAuthorizationDecorator”(通过覆盖)。
'Shaw.Services.CustomerManagement.Host.Repositories.Sql.Decorators.AccountRepositoryAuthorizationDecorator' 正在等待以下依赖项: - 服务“AccountRepositoryFeedEntryDecorator”已注册但也在等待依赖项。
乍一看,似乎发生了某种循环依赖,但我看不出是如何发生的。
所以问题分为两部分,错误信息中的组件和服务依赖规范有什么区别,有什么问题的猜测。
如果这里重要的是升级前的原始注册:
RepositoryRegistration<IAccountRepository, AccountRepositoryFeedEntryDecorator>()
.ServiceOverrides(new { decoratedRepository = typeof(AccountRepositoryAuthorizationDecorator).Name }),
RepositoryRegistration<AccountRepositoryAuthorizationDecorator>()
.ServiceOverrides(new { decoratedRepository = typeof(AccountRepositoryMaskingDecorator).Name }),
RepositoryRegistration<AccountRepositoryMaskingDecorator>()
.ServiceOverrides(new { decoratedRepository = typeof(AccountRepository).Name }),
RepositoryRegistration<AccountRepository>()
【问题讨论】:
标签: c# castle-windsor