2016-07-25 91 views
1

我有這個類和使用的egzample:自動關聯和聚合同治

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;最後一行,所以酒吧的富屬性將被全自動填充的這個實例富?我正在考慮像這個例子中的某種屬性https://documentation.devexpress.com/#CoreLibraries/clsDevExpressXpoAggregatedAttributetopic,因爲我需要這個屬性是通用的,不僅適用於Foo和Bar。

我的問題是:是否有某種內置.net屬性(或任何其他結構),模仿DevExpress AssociationAttribute行爲,它可用於很多關係?如果沒有 - 我怎麼能做到這一點?

回答

1

好,其中一個方案是:不直接暴露List<Bar>並實現Add方法:

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

如果你需要它是通用,不僅對於FooBar,則解決該問題的一種方式是實施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然後使用現有的工具的工作,不要重新發明輪子:例如[實體框架](https: //msdn.microsoft.com/en-us/data/aa937723)。 – InBetween

+0

能否請您將關鍵字或文章傳給我的主題?或者是從數據庫中分離出來的工具? –