我尝试将一些操作提取到一个具有一些附加属性的接口中:
基本实体类:
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);
}
}
更新
我将创建IMyClassRepository
使用Factory
,如下所示:
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);
}
}
问题是如何使用IMyClassRepository
或ClassB
的其他属性创建ClassC
的实现?
答案 0 :(得分:2)
如果我理解正确,你是否试图设计类似于存储库模式的东西?如果是这种情况,您可以为所有实体创建存储库实现。为此,您需要创建一个通用接口,该接口适用于您实体的具体实现......
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容器,您甚至不必自己实现它,您可以通过配置文件定义实现和服务,甚至可以交换它们而无需重新编译整个应用程序。