我有一个通用的存储库类。
public class Repository<TEntity> where TEntity : class
{
public virtual TEntity Create()
{
// Create implementation.
}
public virtual bool Add(TEntity entity)
{
// Add implementation.
}
public virtual bool Delete(TEntity entity)
{
// Delete implementation.
}
public virtual int SaveChanges()
{
// Save changes implementation.
}
}
我有几种与beheaviour不完全匹配的类型,主要用于Create
方法,所以我想做一个具体的实现。
类似的东西:
public class SpecificEntityRepository : Repository<SpecificEntity>
{
public override SpecificEntity Create()
{
// Other create implementation.
}
}
如果某个人使用Repository<SpecificEntity>
返回SpecificEntityRepository
方法的值,有没有办法,例如在SpecificEntityRepository
的构造函数中返回Repository<>
时参数类型等于SpecificEntity
?
我正在寻找一种通用的方法来做到这一点。在我的项目的最终版本中最多可以有200个特定的存储库,其中95%的功能是通用的。
答案 0 :(得分:1)
如果您想阻止人们创建Repository<SpecificEntity>
,您可以创建Repository
构造函数protected
并仅允许通过工厂方法创建实例。
例如:
public class Repository<TEntity> where TEntity : class
{
private static readonly Dictionary<Type, Func<object>> specificRepositories =
new Dictionary<Type, Func<object>>
{
{ typeof(SpecificEntity), () => new SpecificRepository() }
};
protected Repository() {}
public static Repository<T> Create<T>() where T : class
{
var entityType = typeof(T);
if (specificRepositories.ContainsKey(entityType)) {
return (Repository<T>)specificRepositories[entityType]();
}
else {
return new Repository<T>();
}
}
// default implementations omitted
}
我基于Dictionary
上的实体类型基于存储库实例的解析,因为维护起来更方便,但如果我们只讨论几种特定的存储库类型,您可以使用{{ 1}} / if
代替。
答案 1 :(得分:1)
一旦调用了特定的构造函数,就无法更改对象的类 但是你可以使用工厂方法而不是直接调用实际的构造函数:
public static Repository<T> CreateRepository<T>() {
if (typeof(T) == typeof(SpecificEntity)) {
return new SpecificEntityRepository();
}
return new Repository<T>();
}
要确保使用它,您应该保护实际的构造函数。