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