1
我想使用Castle Windsor的裝飾模式爲我的api創建視圖模型,但根據控制器將不同的類注入裝飾器。我有兩個版本的API端點。使用Castle Windsor的裝飾模式,當需要注入不同的類時,取決於調用者
一個用於HomeV1Controller:
public class HomeV1Controller : ApiController {
private readonly IHomeViewModelFactory _factory;
public HomeV1Controller(IHomeViewModelFactory factory) {
_factory = factory;
}
}
和第二:
public class HomeV2Controller : ApiController {
private readonly IHomeViewModelFactory _factory;
public HomeV2Controller(IHomeViewModelFactory factory) {
_factory = factory;
}
}
兩個控制器接受IHomeViewModelFactory
其定義是:
public interface IHomeViewModelFactory {
HomeViewModel CreateViewModel();
}
現在我想注入公共視圖模型兩個控制器的工廠,工廠需要打電話給下一個競爭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;
}
}
和兩個特定的控制器:
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;
}
}
現在HomeV1Controller
需要注入了UserViewModelFactory
其中有HomeV1ViewModelFactory
和HomeV2Controller
需要依賴於有注入UserViewModelFactory
,其依賴於HomeV2ViewModelFactory
。
通常情況下,我們不把任何業務邏輯中的ViewModels,因此沒有理由去嘲笑他們還是要回到DI容器創建它們。使用'new'關鍵字就足夠了。查看[本博客文章](https://cuttingedge.it/blogs/steven/pivot/entry.php?id=97)瞭解更多詳情。 – NightOwl888
@ NightOwl888我不會放任何邏輯來查看模型本身。但邏輯我知道如何虛擬機創建。 – mardok
這很好。我的觀點是,沒有理由使用工廠或DI容器來創建視圖模型。在這種情況下你不需要抽象。你看起來很好的代碼(除了不需要的IHomeViewModelFactory構造函數參數)。 – NightOwl888