2014-10-07 69 views
1

我嘗試提取一些操作與這樣一些附加的屬性的接口:接口用於從基類派生的其他屬性

基實體類別:

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

我將創建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); 
    } 
} 

的問題是如何創建的IMyClassRepositoryClassBClassC附加屬性的實現?

+0

也許繼承不是這裏的解決方案,如果他們都是不同的。 – 2014-10-07 02:25:47

+0

'void Create(MyBaseClass param);'?你能解釋一下這種方法應該做什麼嗎? (通常'Create'會返回剛剛創建的東西,但在您的設計中並非如此)。 – 2014-10-07 02:26:37

+0

@JustinPihony但他們有相同的實體和相同的操作。 – reptildarat 2014-10-07 02:26:42

回答

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); 

你甚至不用自己實現它,如果您使用的是d/I容器,比如溫莎城堡,在這裏您可以通過定義配置文件實現和服務,甚至交換他們沒有必須重新編譯整個應用程序。

+0

我更新我的問題。希望你能更清楚地幫助我:) – reptildarat 2014-10-07 03:00:04

+0

@reptildarat對於同樣的問題,它完全一樣的答案。每次需要存儲庫實例時,必須創建一個工廠對象的實例,這很醜陋。至少你應該讓你的'CreateInstance'方法成爲一個靜態方法......或者讓工廠對象成爲一個單獨對象......或者甚至更好地使用一個依賴注入容器,比如溫莎城堡來避免那些永遠不斷增長的'switch'案例 – Leo 2014-10-07 03:07:36

+0

@reptildarat不用說有一個'enum'來決定返回什麼類型的實體太沒用。這就是泛型適用於在運行時推斷底層數據類型的原因。你有沒有想過當你需要項目中的另一個實體時會發生什麼?這意味着另一個'enum'值和另一個'swicth ... case' ...這是一個巨大的設計問題,因爲自從.Net Framework 2.0以來,有更好的選擇... GENERICS – Leo 2014-10-07 03:09:31

相關問題