1

现在,我正试图找出一种更聪明地做事的方法,在此过程中,我设法做的就是在一天内使用一整瓶 excedrin。

假设我有一个像这样的名为 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
{
    ....
}

好的,这就是基本设置,现在我还想做一件事。我想要透明地进行日志记录和事务以及类似的事情。所以我想做的是使用像 Castle Windsor 或 StructureMap 这样的依赖注入框架,这样当我请求 IRepository 时,我会用 LoggingRepository 和 TransactionRepository 包装它,这两个都实现了 IRepository。

所以,我想做的是这样的:

IUserRepository repository = container.Resolve< IUserRepository>();

并让它返回一个包含在 Logging 和 Transaction 装饰器中的用户存储库,但我想不出一种可行的方法。我能想到让它工作的唯一方法是像这样实现 UserRepository:

public class UserRepository : DecoratorRepository<T>, IUserRepository
{
    protected IRepository<T> Repository { get; set; }

    public UserRepository(IRepository<T> innerRepository)
    {
        Repository = innerRepository;
    }
}

这意味着我们将使用依赖注入来创建一个修饰的存储库并将其传递给 UserRepository 的构造函数,然后将其用作我们对其运行操作的存储库。这会起作用,但我仍然认为它不是理想的。

所以,我的问题是,我是对的,这是做到这一点的唯一方法,还是我没有正确理解这一点,或者只是错过了一些东西。另外,如果你以前遇到过这个问题,你是如何解决这个问题的?

4

2 回答 2

3

如果您要使用听起来正确的装饰器。每个装饰器都有一个带有 IRepository 参数的构造函数,并围绕调用它正在装饰的内部存储库调用日志记录或事务代码。

作为替代方案,您可能会考虑,但我对面向方面编程的经验很少。在这种情况下,您将属性应用于您的类,以指示您要使用的日志记录或事务方法。在某些时候,这些方法会被编织到您的代码中,这可以作为额外的编译步骤来完成,或者在SpringFramework.net的情况下在注入时完成。

于 2009-01-13T16:59:26.190 回答
1

难道你不能有一个 LoggingRepository 抽象基类来处理你不同的 Get、Add、Update、Delete 的日志记录,使它们成为虚拟然后从它们继承吗?

我不确定您要解决什么问题,因为我认为您可能已经尝试过了?您也可以包装事务,尽管您很可能希望在您的 NHibernateRepository 中执行此操作。

于 2009-01-13T16:55:45.963 回答