1

有没有办法创建一个实现以下两个通用接口的基类?然后,这个基类将被“其他”类继承,这些类可以从两个接口中的任何一个调用方法。

public interface IGenericRepositoryOne<E> where E : Entity
{
    void Save(E entity);
    void Save(List<E> entityList);
    E Load(Guid entityId);
}

public interface IGenericRepositoryTwo<D, E> where E : Entity
{
    void Save(D dto);
    void Save(List<D> entityList);
    D Load(Guid entityId);
}

现在我们有两个独立的存储库,分别实现每个接口:

public abstract class RepositoryOne<D, E> : IGenericRepositoryOne<D, E> where E : Entity {...}

public abstract class RepositoryTWO<E> : IGenericRepositoryTwo<E> where E : Entity {...}

然后有些类需要继承RepositoryOneor RepositoryTwo。正是在这些课程中,我希望做一些分解,例如:

public class MessageDataTypeRepository : RepositoryTwo<MyEntityType>
{
    // here when I call the method Load() I want it for RepositoryOne implementation.
}

public class MessageDataTypeRepository : RepositoryOne<MyDTOType, MyEntityType>
{
    // here when I call the method Load() I want it for the RepositoryTwo implementation.
}
4

2 回答 2

3

您可以实现这两个接口,并使用显式接口实现来实现一个或两个。如果需要,这允许您对每个接口有不同的实现。

如果这不是必需的,那么简单地实现两者应该很简单,因为就一种泛型类型而言,两个接口实际上是相同的:

public class Repository<D,E> : IGenericRepositoryOne<D>, IGenericRepositoryTwo<D,E> 
    where D : Entity
    where E : Entity
{
    void Save(D dto) {}
    void Save(List<D> entityList) {}
    D Load(Guid entityId)
    {
          // Implement...
    }
}

编辑:

针对您编辑的问题和您的实际目标 -

这里的一种选择是不使用继承,而是使用组合。通过使用组合,您可以使您的“通用存储库”类公开一个单一的、有意义的接口,并在内部构建适当的存储库。然后它可以根据需要将这些方法映射到适当的存储库。这将使您的存储库有效地成为适配器模式的实现,以使用通用接口包装任一存储库。

于 2013-03-22T19:20:23.083 回答
2

是的,这是可能的,它被称为显式接口实现

您可以使用一种方法从两个接口实现方法:

public void Save(D entity) { }

或单独实施:

public void IGenericRepositoryOne.Save(D entity) { }

public void IGenericRepositoryTwo.Save(D entity) { }
于 2013-03-22T19:20:32.120 回答