2011-06-19 8 views
0

私は基本的に3つの異なる論理層有するアプリケーション設計:DL-BL-UIレイヤ間のキャストを避けるにはどうすればよいですか? (C#)と

  1. (ADO.NETによって実装)DBコネクタ。
  2. BLビジネスロジック(UIが知っている唯一のもの)。
  3. DBリポジトリ(最初の2つの間の接続)。

DBリポジトリは依存関係のセクションに分かれており、すべての最終エンティティは1つのインターフェイスに対して多態性があります。場合によっては、同じ依存関係セクション内のオブジェクト間に依存関係がある--ISectionFactory(したがって依存する) 実際には、BLはMainFactory(すべてのDBの要素です)から特定の型のオブジェクト(私の例ではIngrediantTypeなど)を要求しています この設計のため、UI - 明らかに抗力です。 デザインを変更するにはどうすればよいですか?ここ は、デザインの簡単な外観です:

public class MainFactory 
{ 
    private Dictionary<Type, ISectionFactory> m_SectionsFactories; 
    private ISectionFactory treatmentsSectionFactory = 
      new TreatmentsSectionFactory(); 

    public MainFactory() 
    { 
     m_SectionsFactories = new Dictionary<Type, ISectionFactory> 
      { 
       {typeof(IngrediantType),treatmentsSectionFactory} 
      }; 
    } 

    public IConcreteDataCollection GetConcreteData(Type i_EntitiesName) 
    { 
     return m_SectionsFactories[i_EntitiesName] 
      .GetConcreteData(i_EntitiesName); 
    } 
} 

internal interface ISectionFactory 
{ 
    IConcreteDataCollection GetConcreteData(Type i_EntitiesName); 
} 

public class TreatmentsSectionFactory : ISectionFactory 
{ 
    private Dictionary<Type, IConcreteDataCollection> 
      m_ConcreteDataCollections; 

    private IngrediantTypes m_IngrediantTypes = new IngrediantTypes(); 
    private Ingrediants m_Ingrediants = new Ingrediants(); 

    public TreatmentsSectionFactory() 
    { 
     m_ConcreteDataCollections = 
      new Dictionary<Type, IConcreteDataCollection>(); 
     m_ConcreteDataCollections 
      .Add(typeof(IngrediantType), m_IngrediantTypes); 
     m_ConcreteDataCollections 
      .Add(typeof(Ingrediants), m_Ingrediants); 
    } 

    public IConcreteDataCollection GetConcreteData(Type i_EntitiesName) 
    { 
     return m_ConcreteDataCollections[i_EntitiesName]; 
    } 
} 

public interface IConcreteDataCollection : IEnumerable 
{ 
    // Iteratable. 
    IConcreteData GetById(int i_Id); 
    void AddNewConcreteData(IConcreteData i_ConcreteData); 
    void UppdateConcreteData(IConcreteData i_ConcreteData); 
    void DeleteConcreteData(IConcreteData i_ConcreteToDelete); 
} 

public class IngrediantTypes : IConcreteDataCollection 
{ 
    public string TestType { get; set; } 
    public IConcreteData GetById(int i_Id){} 
    public void AddNewConcreteData(IConcreteData i_ConcreteData){} 
    public void UppdateConcreteData(IConcreteData i_ConcreteData){} 
    public void DeleteConcreteData(IConcreteData i_ConcreteToDelete){}   
    public IEnumerator GetEnumerator(){} 
} 

// also implements IConcreteDataCollection 
public class Ingrediants : IConcreteDataCollection 
{ 
} 

public interface IConcreteData 
{ 
    public int Index { set; get; }   
} // the final (highest) entity of all DB entities 

public class IngrediantType : IConcreteData 
{ 
    public int Index { set; get; } 
    // other set of properties 
} 

public class Ingrediant : IConcreteData 
{ 
    public int Index { set; get; } 
    public IngrediantType RelatedIngrediantType { set; get; } 
    // other set of properties 
} 

public class mainClass 
{ 
    public static void main() 
    { 
     MainFactory factory = new MainFactory(); 

     var type = typeof(IngrediantType); 

     // returns a IngrdiantTypes of type (IConcreteDataCollection) 
     var t = factory.GetConcreteData(typeof(IngrediantType)); 

     // I want to use the IngrediantType without casting !!! 
     var s = t.GetById(2); 
    } 
} 

答えて

0

それはここで何が起こっているのか教えて少し難しいですが、私は、キーはそうのようなジェネリック医薬品を利用するようになると思う。

public IConcreteDataCollection<T> GetConcreteData<T>() 
{ 
    return ...; 
} 

場合あなたがジェネリックを使用するようにコード内のほぼすべてのクラスを変更する必要があります

var t = factory.GetConcreteData<IngrediantType>(); 

:私は、これはあなたが言うことができます、正しくあなたの質問を理解しています。

関連する問題