覆盖属性冲突

时间:2016-09-22 22:04:30

标签: c# entity-framework

我有两个复杂的课程:

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子类?

1 个答案:

答案 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

例如。