2016-10-06 3 views
0

私は種類の基本的な組成を有している:'new'を使わずにコンストラクションクラスを構築できますか?

class A{ 
    public A(B1 b1, B2 b2){ 
     this.b1 = b1; 
     this.b2 = b2; 
    } 
    public B1 b1 {get; private set;} 
    public B2 b2 {get; private set;} 
} 

class B1{ 
    public B1(C1 c1, C2 c2, C3 c3){ 
     this.c1 = c1; 
     this.c2 = c2; 
     this.c3 = c3; 
    } 
    public C1 c1 {get; private set;} 
    public C2 c2 {get; private set;} 
    public C3 c3 {get; private set;} 
} 
class B2{ 
    public B2(C1 c1, C2 c2, C3 c3){ 
     this.c1 = c1; 
     this.c2 = c2; 
     this.c3 = c3; 
    } 
    public C1 c1 {get; private set;} 
    public C2 c2 {get; private set;} 
    public C3 c3 {get; private set;} 
} 

class C1{} 
class C2{} 
class C3{} 

Aを構築するクリーンな方法はありますか?

public static void Main() 
{ 
    A a = new A(new B1(new C1(), new C2(), new C3()), new B2(new C1(), new C2(), new C3())); 
} 

newを使用せずに同じ構成を実現できますか?
これを可能にするためにコンストラクタに何かできることはありますか?

+0

異なる「c1」、「c2」、「c3」は何を表していますか? –

+0

すべてのデフォルトコンストラクタなので、すべてのコンストラクタパラメータに 'null'のデフォルト値を与え、' this.c1 = c1 ??新しいC1(); 'しかし、私はあなたがパラメータ化されたコンストラクタを表すためにデフォルトのコンストラクタを使用していると感じています。 –

+1

'new'をコンストラクタに内部化し、効果的に必要なパラメータだけを設定することができます。または、IoC(理にかなっている)を使用してより洗練されたソリューションを使用することもできます。 –

答えて

3

Aのデフォルトコンストラクタでは、新しいB年代を作成し、BのデフォルトコンストラクタでそれがCのあなたがタイプを構成する際に考慮すべきちょうどA a = new A();

class A{ 
    public A() : this(new B1(), new B2()) 
    { 
    } 

    public A(B1 b1, B2 b2){ 
     this.b1 = b1; 
     this.b2 = b2; 
    } 
    public B1 b1 {get; private set;} 
    public B2 b2 {get; private set;} 
} 

class B1{ 
    public B1() : this(new C1(), new C2(), new C3()) 
    { 
    } 

    public B1(C1 c1, C2 c2, C3 c3){ 
     this.c1 = c1; 
     this.c2 = c2; 
     this.c3 = c3; 
    } 
    public C1 c1 {get; private set;} 
    public C2 c2 {get; private set;} 
    public C3 c3 {get; private set;} 
} 
class B2{ 
    public B2() : this(new C1(), new C2(), new C3()) 
    { 
    } 

    public B2(C1 c1, C2 c2, C3 c3){ 
     this.c1 = c1; 
     this.c2 = c2; 
     this.c3 = c3; 
    } 
    public C1 c1 {get; private set;} 
    public C2 c2 {get; private set;} 
    public C3 c3 {get; private set;} 
} 

class C1{} 
class C2{} 
class C3{} 

public static void Main() 
{ 
    A a = new A(); 
} 
2

代替にそれを簡素化することができ作成した場合特に、より良い依存性注入を達成するためにnewをハードコーディングするのを避けたい場合は、依存性コンテナを使用することです。あなたがどうなるAutofacを使用して例えば

、:

var builder = new ContainerBuilder(); 

builder.RegisterType<A>(); 
builder.RegisterType<B1>(); 
builder.RegisterType<B2>(); 
builder.RegisterType<C1>(); 
builder.RegisterType<C2>(); 
builder.RegisterType<C3>(); 

var container = builder.Build(); 

var a = container.Resolve<A>(); 

これはあなたの簡単な例のためにやり過ぎのように思えるかもしれませんが、あなたが本当に複雑なオブジェクトグラフを構成している場合、それは考慮すべき何か。

0

いいえ新しいキーワードがないと、コンストラクタ内にオプションのパラメータを持つことができます。新しいオブジェクトを作成します。

class A 
{ 

//Proper Immutable property works only c# 6 
     public B1 B1 { get; } 
     public B2 B2 { get; } 
     public A(B1 b1 = null, B2 b2 = null) 
     { 
      B1 = b1??new B1(); 
      B2 = b2??new B2(); 
     } 
} 

しかし、これは不変のオブジェクトにとって意味がなく、メモリを使用する理由がないため、nullにしておくほうがよいです。

関連する問題