在泛型类中,我必须创建一个相同类型的新对象:
public abstract class ViewModel<TPrimaryModel>
{
public void DoSomething()
{
...
ViewModel<TPrimaryModel> newViewModel = new TPrimaryModel(someArguments);
}
}
C#不支持这样做。所以我决定引入CreateInstance
- 方法:
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
- 类)是类变量。
不幸的是,有些ViewModel
需要更多的服务。
例:
ViewModelA viewModelA = new ViewModelA(serviceA, 5, "ViewModelA");
ViewModelB viewModelB = new ViewModelB(serviceB, serviceA, 6, "ViewModelB");
我想知道什么是正确的方法。封装对象创建的参数?工厂模式?或者我应该在那种情况下避免继承并坚持组合?
我也可以随时通过&#34;所有&#34;服务。或者提供一个提供所有服务访问权限的类。但我想这些都是糟糕的想法。
答案 0 :(得分:0)
我不太了解你的其他架构,但这些都是我的考虑因素:
如果我已经使用DI:每个服务/类型bootstrapping配置的大多数容器支持。只要你在作曲期间没有开始做动态的东西,它应该保持相当全面
其他:传递Func<ViwModel<T>>
工厂方法(作为构造函数参数到基类)。这可能是做你想做的最简单,最干净的方式。
正如你所指出的那样,通过所有服务(这将是一个难以维护的混乱)并不是一个好主意。当涉及到服务定位器模式(引用“或者提供一个提供对所有服务的访问权限的类”)时,这是一个非常自以为是的讨论,在那里有一些非常好的见解:Is ServiceLocator an anti-pattern?如果你问我;还有更多的地方比其他方面更有害。但是,嘿,这是你的软件。