【发布时间】:2020-11-02 09:44:52
【问题描述】:
我想知道是否可以在 C# 中为多个已实现接口中的 1 个提供装饰器。我倾向于不,但也许。
这就是我的意思
public abstract class Auditable
{
public string CreatedBy { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime ModifiedAt { get; set; }
public string ModifiedBy { get; set; }
}
public class MyClass : Auditable
{
// <...> properties
}
public interface IWriteRepository<T> : where T : Auditable
{
T Create(T entity);
T Update(T entity);
}
public class AuditRepositoryDecorator<T> : IWriteRepository<T> where T : Auditable
{
private readonly IWriteRepository<T> _decorated;
// <...> ctor with injects
public T Create(T entity)
{
entity.ModifiedAt = time;
entity.CreatedAt = time;
entity.CreatedBy = invoker;
entity.ModifiedBy = invoker;
return _decorated.Create(entity);
}
public T Update(T entity)
{
entity.ModifiedAt = time;
entity.ModifiedBy = invoker;
return _decorated.Update(entity);
}
}
public interface IMyClassRepository : IWriteRepository<MyClass>
{
MyClass Get(int id);
}
所以我希望能够依赖IMyClassRepository 存储库,并且每当Create 或Update 被调用时,它都会通过AuditRepositoryDecorator。这是一段经常执行的逻辑,我认为作为装饰器而不是与某些执行相同操作的接口建立组合关系会简单得多。
IAuditableRepository 永远不会直接实例化,因为它总是由另一个接口实现,所以我认为可能无法实现我想要实现的目标。
我使用带有Scrutor 的默认dnc2.1 DI 框架进行装饰。
【问题讨论】:
标签: c# design-patterns dependency-injection decorator