[英]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);
}
}
問題是如何使用ClassB
或ClassC
其他屬性創建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.