2016-11-04 8 views
2

に依存:一般的な実装が、コンストラクタの引数は、私は、同じタイプの新しいオブジェクトを作成する必要があり、具体的なクラスにジェネリッククラスで

public abstract class ViewModel<TPrimaryModel> 
{ 
    public void DoSomething() 
    { 
     ... 
     ViewModel<TPrimaryModel> newViewModel = new TPrimaryModel(someArguments); 
    } 
} 

のC#でサポートされていないこれを行います。だから私はCreateInstance -methodを導入することを決定した:

public abstract class ViewModel<TPrimaryModel> 
{ 
    public void DoSomething() 
    { 
     ... 
     ViewModel<TPrimaryModel> newViewModel = CreateInstance(someArguments); 
    } 

    protected abstract ViewModel<TPrimaryModel> CreateInstance(Object someArguments); 
} 

public class UserViewModel : ViewModel<User> 
{ 
    public UserViewModel(Object someArguments) 
    { 
     ... 
    } 

    protected override ViewModel<TPrimaryModel> CreateInstance(Object someArguments) 
    { 
     return new UserViewModel(someArguments);   
    } 
} 

渡されなければならなパラメータ(一部Service -classes)はクラス変数です。残念ながら、ViewModelにはいくつかのサービスが必要です。 例: ViewModelA viewModelA = new ViewModelA(serviceA, 5, "ViewModelA"); ViewModelB viewModelB = new ViewModelB(serviceB, serviceA, 6, "ViewModelB");

私が行くための正しい方法は何だろうか。オブジェクト作成の引数をカプセル化しますか?ファクトリーパターン?あるいは、そのような状況で継承を避け、構成に固執すべきですか?

私はいつも "すべての"サービスを渡すこともできます。または、すべてのサービスへのアクセスを提供するクラスを提供する。しかし、私はそれらが悪い考えだと思います。

+1

「DoSomething」はどこから引数を取得するのですか?確かにそれ自体で問題があります...情報がどのように流れるかについてもう少し説明すれば助けになります。 –

+0

'DoSomething()'抽象化を行い、その機能を保護されたメソッドに分割することは可能でしょうか? –

+0

@JonSkeetそれは私が見る限り、クラス変数を渡すだけです。だから、これは問題ではありません。 – mosquito87

答えて

0

私はあなたのアーキテクチャの残りの部分についてのすべてのあまり知らないが、これらは私の配慮のようになります。私はすでにDIを使用している場合は

:サービス/タイプのブートストラップコンフィギュレーションあたりほとんどのコンテナサポート。限り、あなたが組成物中に動的なものを行うために開始していないとして、それは他の

かなり包括的なままにしてください:は(あなたのベースクラスにコンストラクタのパラメータとして)Func<ViwModel<T>>ファクトリメソッドを渡します。それはおそらく、あなたがしたいことをする最も簡単でクリーンな方法です。

すべてのサービスを渡すことを指摘したように(まったく素早く手放すことはできません)、それは良い考えではありません。サービス・ロケータ・パターン(「すべてのサービスへのアクセスを提供するクラスを提供する」と言います)に関しては、これは非常に有益な議論であり、そこには非常に良い洞察があります:Is ServiceLocator an anti-pattern?私に尋ねると、それは他の方法よりも害が多い場所があります。しかし、ちょっと、それはあなたのソフトウェアです。

関連する問題