哪个是更好的C#类设计来处理read + write和readonly

dev*_*xer 13 c# architecture design-patterns class-design

我正在考虑两种不同的类设计来处理某些存储库是只读的而其他存储库是读写的情况.(我预见不需要只写存储库.)


类设计1 - 提供基类中的所有功能,然后在子类中公开显示适用的功能

public abstract class RepositoryBase
{
    protected virtual void SelectBase() { // implementation... }
    protected virtual void InsertBase() { // implementation... }
    protected virtual void UpdateBase() { // implementation... }
    protected virtual void DeleteBase() { // implementation... }
}

public class ReadOnlyRepository : RepositoryBase
{
    public void Select() { SelectBase(); }
}

public class ReadWriteRepository : RepositoryBase
{
    public void Select() { SelectBase(); }
    public void Insert() { InsertBase(); }
    public void Update() { UpdateBase(); }
    public void Delete() { DeleteBase(); }
}
Run Code Online (Sandbox Code Playgroud)

类设计2 - 读写类继承自只读类

public class ReadOnlyRepository
{
    public void Select() { // implementation... }
}

public class ReadWriteRepository : ReadOnlyRepository
{
    public void Insert() { // implementation... }
    public void Update() { // implementation... }
    public void Delete() { // implementation... }
}
Run Code Online (Sandbox Code Playgroud)

这些设计中的一个明显比另一个强吗?如果是这样,哪一个和为什么?

PS如果这听起来像是一个家庭作业的问题,它不是,但如果你想要,可以随意使用它作为一个:)

Eri*_*lje 26

第三个选项如何与第一个选项密切相关,但使用接口代替:

public interface IReadRepository {
    public void Select();
}

public interface IWriteRepository {
    public void Insert();
    public void Update();
    public void Delete();
}

// Optional
public interface IRepository : IReadRepository, IWriteRepository {
}

public class Repository : IRepository {
   // Implementation
}
Run Code Online (Sandbox Code Playgroud)

这种方式的实现是(或可以)所有在一个地方,并且仅通过您正在查看的接口进行区分.

  • @Henk - 确切地说,你可以跳过IWriteRepository并简单地让IRepository接口定义write方法.这将为您提供他的第二个设计的优点,但不要求他在两个类之间拆分实现. (3认同)

sta*_*ica 5

(编辑:我认为Eric Petroelje在他的回答中提供了一个非常好的基于界面的解决方案.我可能会投票给他的建议,首先.)

从你的两个选择,我会明确投票给设计#2.

对于设计#1,我认为拥有一个内部不是只读的"只读"类是没有意义的:

  1. 只读类比它需要的"更重".

  2. 任何人都可以从您的只读类派生,然后调用任何基类的修改方法.至少,设计#1,您应该制作只读类sealed.

对于设计#2,它比只读类更清晰,是全功能类的简化版(基类),或者措辞不同.