有没有办法创建一个实现以下两个通用接口的基类?然后,这个基类将由“其他”类继承,这些类可以从两个接口中的任何一个调用方法。
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 {...}
然后有些类需要继承RepositoryOne
或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.
}
答案 0 :(得分:3)
您可以实现这两个接口,并使用Explicit Interface Implementation实现一个或两个接口。如果需要,这允许您为每个接口实现不同的实现。
如果这不是一个要求,那么简单地实现两者应该是直截了当的,因为两个接口在一个通用类型方面实际上是相同的:
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...
}
}
编辑:
回复您编辑的问题以及您的实际目标 -
这里的一个选择是不使用继承,而是使用组合。通过使用组合,您可以使“通用存储库”类公开单个有意义的接口,并在内部构建相应的存储库。然后,它可以根据需要将方法映射到适当的存储库。这将使您的存储库有效地成为Adapter Pattern的实现,以使用公共接口包装任一存储库。
答案 1 :(得分:2)
是的,它是可能的,它被称为Explicit Interface Implementation
您可以使用一种方法从两个接口实现方法:
public void Save(D entity) { }
或单独实施:
public void IGenericRepositoryOne.Save(D entity) { }
public void IGenericRepositoryTwo.Save(D entity) { }