Castle Windsorを使用してデコレーターパターンを使用して、私のAPIのビューモデルを作成します。 apiエンドポイントの2つのバージョンがあります。 HomeV1Controllerためキャスターウィンザーを使用したデコレーターパターン呼び出し元に応じて異なるクラスを注入する必要がある場合
ワン:
public class HomeV1Controller : ApiController {
private readonly IHomeViewModelFactory _factory;
public HomeV1Controller(IHomeViewModelFactory factory) {
_factory = factory;
}
}
と第二:
public interface IHomeViewModelFactory {
HomeViewModel CreateViewModel();
}
今私は、共通のビューモデルを注入したいと思います:
public class HomeV2Controller : ApiController {
private readonly IHomeViewModelFactory _factory;
public HomeV2Controller(IHomeViewModelFactory factory) {
_factory = factory;
}
}
両方のコントローラはそれが画成IHomeViewModelFactory
を受け入れます両方のコントローラの工場とその工場は次のコールを呼び出す必要がありますコントローラに固有のwモデルファクトリです。だから私は工場があります。
共通:
public class UserViewModelFactory : IHomeViewModelFactory {
private readonly IHomeViewModelFactory _factory;
public UserViewModelFactory(IHomeViewModelFactory factory) {
_factory = factory;
}
public HomeViewModel CreateViewModel() {
var vm = _factory.CreateViewModel();
vm.User = new User();
return vm;
}
}
とコントローラのための具体的な2:
public class HomeV1ViewModelFactory : IHomeViewModelFactory {
public HomeViewModel CreateViewModel() {
// logic only for V1 to create vm
var vm = new HomeViewModel {
Articles = new Articles()
};
return vm;
}
}
public class HomeV2ViewModelFactory: IHomeViewModelFactory {
public HomeViewModel CreateViewModel() {
// logic only for V2 to create vm
var vm = new HomeViewModel {
Issues = new Issues()
};
return vm;
}
}
を今HomeV1ViewModelFactory
とHomeV2Controller
の依存関係を持つUserViewModelFactory
を注入したのはHomeV1Controller
ニーズが持っている必要がありますHomeV2ViewModelFactory
の依存性を有する注入されたUserViewModelFactory
である。私は考えることができる
入れていないため、それらを模擬するため、または背面にDIコンテナに行くことに理由はありませんそれらを作成します。 'new'キーワードを使うだけで十分です。詳細については、[このブログの投稿](https://cuttingedge.it/blogs/steven/pivot/entry.php?id=97)を参照してください。 – NightOwl888
@ NightOwl888私はモデルそのものを見るためにどんな論理にも入れません。しかし、私はVMがどのように作られているかを論理的に説明します。 – mardok
それはいいです。私のポイントは、ビューモデルを作成するために工場またはDIコンテナを使用する理由がないということです。このシナリオでは、抽象概念は必要ありません。あなたが持っているコードは、( 'IHomeViewModelFactory'の不要な' constructor 'パラメータを除いて)素晴らしいです。 – NightOwl888