2016-07-25 8 views
1

自動協会と集約経営管理論

public class Foo 
{ 
    public List<Bar> Bars = new List<Bar>(); 
} 

public class Bar 
{ 
    public Foo Foo; 
} 
public void Example() 
{ 
    var f = new Foo(); 
    var b = new Bar(); 

    f.Bars.Add(b); 
    b.Foo = f; 
} 

はコードb.Foo = f;の最後の行を避けるためにどのような方法があり、そのバーのFooのプロパティが自動にのこのインスタンスで満たされるでしょうフー?私はFooとBarだけでなく、この属性が一般的である必要があるので、この例のような何らかの種類の属性について考えていた。https://documentation.devexpress.com/#CoreLibraries/clsDevExpressXpoAggregatedAttributetopic

私の問題は次のとおりです:DevExpress AssociationAttributeの動作を模倣し、多くのリレーションシップで使用可能な組み込みの.net属性(または他の構造)がありますか?いいえ - 私はこれをどのように達成することができますか?

public class Foo 
{ 
    private readonly List<Bar> bars = new List<Bar>(); 
    public IEnumerable<Bar> Bars => bars.Select(b => b); 
    public void AddBar(Bar bar) 
    { 
     bar.Foo = this; 
     bars.Add(bar); 
    } 
} 

そして今、あなたのコードは次のようになります:あなたはそれがジェネリックにする必要がある場合

public void Example() 
{ 
    var f = new Foo(); 
    var b = new Bar(); 
    f.AddBar(b); 
} 

答えて

1

まあ、一つの選択肢は、直接List<Bar>を公開してAddメソッドを実装しないことであろうFooBarだけでなく、それを解決する方法の1つは、IChildインターフェイスを実装することです:

public interface IChild<T> 
{ 
    public T Parent { get; set; } 
} 

そして今、あなたは次のことを行うことができます:

public class Foo 
{ 
    private readonly List<IChild<Foo>> children = new List<IChild<Foo>>(); 
    public IEnumerable<IChild<Foo>> Children => children.Select(b => b); 
    public void AddChild(IChild<Foo> child) 
    { 
     children.Add(child); 
     child.Parent = this; 
    } 
} 
+0

をしかし、現実の世界でのビジネスクラスは、関係の多くを持って、顧客は、ショップ、アドレスを注文します。注文は製品、マネージャーなどにあり、それは非常に反復性があり、5 +リレーションシップへのこのアプローチを使用するのは間違いが多いです。 –

+0

@BartekWójcik次に、ジョブのために既存のツールを使用します。例えば、[Entity framework](https: //msdn.microsoft.com/en-us/data/aa937723)。 – InBetween

+0

efでトピックにキーワードや記事を渡してください。またはデータベースとは別のツールですか? –

関連する問題