c# - 具有依赖注入(inject)的存储库和专用存储库的装饰器链接

标签 c# dependency-injection domain-driven-design repository-pattern decorator-chaining

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

假设我有一个名为 IRepository 的接口(interface)。

 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 这样的依赖注入(inject)框架,这样当我请求 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;
    }
}

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

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

最佳答案

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

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

关于c# - 具有依赖注入(inject)的存储库和专用存储库的装饰器链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/439729/

相关文章:

C# 数据局部性 : reference type in an array of structs

C# redis vs mongodb 性能

c# - 在 LINQ 查询中使用内置的 sql 函数?

java - @PersistenceContext 如何保证线程安全?

asp.net-core - Asp.Net core ActionFilter 上下文请求体处理

asp.net-mvc - NInject 和 MVC 3 - 我应该使用 DependencyResolver 而不是 [Inject] 属性吗?

domain-driven-design - CQRS-命令是否应尝试创建 “complex”主从实体?

domain-driven-design - DDD : How to handle large collections

c# - 如果您创建一个 DomainService,公开一个实体,您可以访问聚合实体吗?

model-view-controller - 阅读实际生产项目的代码。怎么找?