[英]Object creation strategy in domain driven design with repositories
我正在玩Domain Driven Development。 我使用的通用存储库实现定义如下:(这是作为Repository<T>
)
public interface IRepository<T> where T : class, IEventSource, new()
{
T FindByKey(Guid key);
IEnumerable<T> FindByQuery(Predicate<T> filter);
IEnumerable<T> GetAll();
T CreateObject();
}
假设我有一个Order类,没有Customer参数就无法创建。 我正在使用CreateObject来设置具有顺序Guid生成器的实体的Key。
什么是最小化开发时间和耦合的解决方案?
params object[] args
,但这在编译时不是类型安全的。 更新
我按照sll的回答实施了这个策略。 现在,存储库的新签名是:
public interface IRepository<T> where T : class, IEventSource
{
T FindByKey(Guid key);
IEnumerable<T> FindByQuery(Func<T, bool> predicate);
IEnumerable<T> GetAll();
T CreateObject();
T CreateObject(IConstructorParameters parameters);
}
无参数CreateObject
通过尝试调用无参数构造函数(使用IL Emit实现性能)来创建实例。
第二个CreateObject
尝试创建一个方法来调用构造函数,其中IConstructorParameters
上的IConstructorParameters
与Entity对象上的构造函数匹配。
执行:
private Dictionary<Type, Func<IConstructorParameters, T>> _constructionMethods
= new Dictionary<Type, Func<IConstructorParameters, T>>();
public T CreateObject(IConstructorParameters args)
{
T newObject;
if (args == null)
{
args = ConstructorParameters.Empty;
}
Type paramType = args.GetType();
Func<IConstructorParameters, T> constructor;
if (!_constructionMethods.TryGetValue(paramType, out constructor))
{
//Emit IL to create a Func<IConstructorParameters,T>
constructor = CreateConstructor(paramType);
_constructionMethods.Add(paramType, constructor);
}
newObject = constructor(args);
newObject.Key = _guidCreator.Generate();
return newObject;
}
一些观点作为建议,我会做如下。
如果您不想实现IOrderRepository
- 您可以通过IConstructionParameters
类的接口抽象CreateObject()
方法参数,然后为每个实体实现具体参数,如OrderConstructionParameters
。
这种方法也称为参数对象设计模式,其设计原理 - 更多解耦系统设计。
public interface IRepository<T>
{
T CreateObject(IConstructionParameters parameters);
}
public sealed class OrderConstructionParameters : IConstructionParameters
{
public Customer Customer
{
get;
private set;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.