簡體   English   中英

具有從基類派生的其他屬性的接口

[英]Interface With additional property derived from base class

我嘗試將一些操作提取到具有一些其他屬性的接口中,例如:

基礎實體類:

public enum MyClassEnum
{
    classA,
    classB,
    classC
}

public abstract class MyBaseClass
{
    public string entityA { get;set; }
    public int entityB { get; set; }
}

然后我有一些從MyBaseClass派生的類:

public class ClassA : MyBaseClass{}

public class ClassB : MyBaseClass
{
    public string AnotherEntity { get; set; }
}

public class ClassC : MyBaseClass
{
    public string AnotherEntity2 { get; set; }
    public string AnotherEntity3 { get; set; }
}

我嘗試有一個這樣的接口(這是我到目前為止):

public interface IMyClassRepository
{
    void Create(MyBaseClass param);
    void Update(MyBaseClass param);
}

而具體的類應該是這樣的:

public class ClassBRepository : IMyClassRepository
{
    private readonly BaseRepository _baseRepository;

    public ClassBRepository
    {
        _baseRepository = new BaseRepository();
    }

    public void Create(MyBaseClass param)
    {
        // will use automapper to do the mapping
        var theClassB = MyBaseClass.TranslateTo<ClassB>();

        // How i can design the interface that accept additional Property on class B?

        // last save the operation to DB..
        _baseRepository.Save(theClassB);
    }
}

UPDATE

我將使用Factory創建IMyClassRepository

public class MyClassFactory
{
    public IMyClassRepository CreateInstance(MyClassEnum param)
    {
        switch(param)
        {
            case MyClassEnum.ClassA
            {
                return new ClassARepository;
            }

            case MyClassEnum.ClassB
            {
                return new ClassBRepository;
            }

            case MyClassEnum.ClassC
            {
                return new ClassCRepository;
            }
        }
    }
}

最后有這樣的操作類:

public class ConcreteOperationClass
{
    private IMyClassRepository _myClass;
    public ConcreteOperationClass(MyClassEnum param)
    {
        _myClass = new MyClassFactory().CreateInstance(param);
    }

    public void CreateMyClass(MyBaseClass param, // this should be a parameter class B or Class C needed)
    {
        _myClass.Create(param, // additional property for classB or classC);
    }
}

問題是如何使用ClassBClassC其他屬性創建IMyClassRepository的實現?

如果我理解正確,那么您正在嘗試設計類似於存儲庫模式的內容嗎? 在這種情況下,您可以為所有實體創建一個存儲庫實現。 為此,您將需要創建一個與實體的具體實現一起使用的通用接口。

public interface IMyClassRepository<T> where T : MyBaseClass
{
    T Get(int id);
    void Create(T param);
    void Update(T param);
}

然后為每個實體創建此存儲庫的實現...

public ClassARepo : IMyClassRepository<ClassA>{...}

然后,您可以創建一個工廠對象,該對象可以隨時為這些具體實現提供服務。 就像是...

var repository = RepositoryFactory.Resolve<ClassB>(); 
ClassB entity = repository.Get(234);
entity.entityA = "new value";
repository.Update(entity);

如果使用諸如Windsor Castle之類的D / I容器,您甚至不必自己實現它,即可在其中通過配置文件定義實現和服務,甚至交換它們而不必重新編譯整個應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM