我有两个复杂的课程:
public class BaseRepository<EntityType> where EntityType : class
{
protected northwindDataContext context = new northwindDataContext();
public EntityType Get(object id)
{
return context.Set<EntityType>().Find(id);
}
public EntityType Save(EntityType entity)
{
// Do generic save things
}
}
public class BaseService<EntityType> where EntityType : class
{
public BaseRepository<EntityType> repo = new BaseRepository<EntityType>();
public EntityType Get(object id)
{
// Do generic get entities
return repo.Get(id);
}
}
然后我有多个“服务”类,有时(并不总是)我需要“替换”存储库以添加一些“额外”功能。
public class UserRepository : BaseRepository<User>
{
public User Get(object id)
{
// Do specific user get including Role DP
return context.Users.Include("Role").Find(id);
}
}
public class UserService : BaseService<User>
{
public UserRepository repo = new UserRepository();
}
使用此格式,UserService的实例调用BaseRepository.Get()而不是UserRepository.Get()。
实现我想要的唯一方法是像这样复制代码:
public class UserService : BaseService<User>
{
public UserRepository repo = new UserRepository();
public User Get(object id)
{
// This call to UserRepository.Get()
return repo.Get(id);
}
}
真正的问题是我有29个“存储库”,所以我需要添加“Get(int)”,“Get(谓词)”,“保存(实体)”,“保存(IEnumerable)”,“删除(实体)“和”删除(IEnumerable)“,这就是一种尴尬的代码。
有没有办法在BaseService中替换属性“repo”,以便BaseService方法调用repo子类?
答案 0 :(得分:3)
听起来你真正想要的是#first
字段(它是一个字段,而不是一个属性 - 我不鼓励你使用公共字段,但这是另一回事)才是合适的种类类型的存储库。这很容易做到 - 只是不要在#somepara
中创建它。相反,将它传递给构造函数链:
BaseService<T>.repo
事实上,如果BaseService<T>
没有提供任何其他值,您可能只需要// Type parameter renamed to follow normal .NET naming conventions
public abstract class BaseService<T> where T : class
{
private readonly BaseRepository<T> repo;
protected BaseService(BaseRepository<T> repo)
{
this.repo = repo;
}
public T Get(object id)
{
// Do generic get entities
return repo.Get(id);
}
}
public class UserService : BaseService<User>
{
public UserService() : base(new UserRepository())
{
}
}
,非抽象和公共构造函数来获取回购。然后你只需使用:
UserService
例如。