库和专业库的装饰链接与依赖注入
题
现在,我试图找出一种方法来做事聪明,并且在这样做的过程中,因此所有我设法做的是使用满瓶埃克塞德林的一天。
假设我有称为IRepository像这样的接口。
public interface IRepository<T>
{
T Get(int id);
void Add(T value);
void Update(T value);
void Delete(T value);
...
}
和假设我有一个像
的实施public class NHibernateRepository<T>
{
...
}
现在,一切都很好,好,我可以做我所有的基本操作对库支持所有的CRUD功能,但我可能要专业化经营,所以假设我有一个这样的接口:
public interface IUserRepository : IRepository<User>
{
IList<User> GetUsersByRole(Role role);
}
和像这样的实施方式:
public class UserRepository : NHibernateRepository<User>, IUserRepository
{
....
}
好了,这是基本的设置,现在有,我想做的一两件事。我想有记录和交易之类的东西都透明。所以,我希望做的是使用像温莎城堡或StructureMap的依赖注入框架,这样,当我要求IRepository,我会得到它由LoggingRepository和TransactionRepository,这两者的实现IRepository包裹着。
所以,我想要做的是这样的:
IUserRepository repository = container.Resolve< IUserRepository>();
和有它返回真实裹在记录和交易装饰用户系统信息库,但我不能想办法,这都不会工作。我能想到得到这个工作的唯一途径是通过实施UserRepository像这样:
public class UserRepository : DecoratorRepository<T>, IUserRepository
{
protected IRepository<T> Repository { get; set; }
public UserRepository(IRepository<T> innerRepository)
{
Repository = innerRepository;
}
}
这将意味着,我们将使用扶养注射来创建一个装饰库并传递到UserRepository的构造函数,然后使用它作为我们在其中运行针对操作的存储库。这将工作,但我仍然不认为这是理想的。
所以,我的问题是,我是对的,这是做到这一点的唯一办法,还是我没有正确理解这个或只是失去了一些东西放在一起。另外,如果你对这个问题之前运行了,你是怎么解决这个问题?
解决方案
如果您要使用装饰这听起来是正确的。每个装饰将具有与IRepository的参数的构造和呼叫日志记录或事务代码周围调用它装饰的内存储库。
作为替代方案可以考虑,但我有一个是面向方面的编程经验非常少。在这种情况下,您将属性应用于您的类,表明你想要的记录或交易的方法来使用。在某些时候,这些方法得到编织成你的代码,这是可以做到无论是作为一个额外的编译步骤,或在的 SpringFramework.net 在注射时间。
其他提示
你能不能有一个LoggingRepository抽象基类,将处理记录为不同的获取,添加,更新,删除,使他们的虚拟然后从他们继承?
我不知道虽然你正在试图解决但正如我想你可能已经尝试这个什么问题?你可以在交易中换为好,但最有可能你会想这样做,在你的NHibernateRepository。
该博客看起来像一个解决方案你的问题。它基本上是相同的设计,除了代替具有保护IRepository你让私人只读。