2016-11-04 54 views
2

在一个泛型类我要创建同一类型的新对象:通用实现,但是构造函数的参数取决于具体的类

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 s需要更多的服务,然后其他人。 例子: ViewModelA viewModelA = new ViewModelA(serviceA, 5, "ViewModelA"); ViewModelB viewModelB = new ViewModelB(serviceB, serviceA, 6, "ViewModelB");

我不知道什么是走正道。封装对象创建的参数?工厂模式?还是应该避免在这种情况下继承并坚持构图?

我总是可以通过“所有”服务。或者提供一个可以访问所有服务的类。但我想这些都是坏主意。

+1

“DoSomething”的意思是从哪里获得参数?当然,这本身就有问题......如果你能更多地解释信息流动的话,这将会有所帮助。 –

+0

是否可以创建DoSomething()抽象,然后将其功能划分为受保护的方法? –

+0

@JonSkeet它只是传递类变量,据我所知。所以这不应该是问题。 – mosquito87

回答

0

我不知道所有的太多关于你的架构的休息,但这些将是我的考虑:

如果我已经使用DI:每个服务/类型的自举配置大多数容器的支持。只要你在构图期间没有开始做动态的东西,它应该保持相当全面。

否则:通过一个工厂方法(作为基类的构造参数)。这可能是最简单和最干净的方式来做你想做的事情。

正如你所指出的那样,通过所有服务(相当快速的将会是一个难以维护的混乱)并不是一个好主意。当涉及到服务定位器模式(引用你“或提供一个可以访问所有服务的类)”时,这是一个非常有见地的讨论,在那里有一些非常好的见解:Is ServiceLocator an anti-pattern?如果你问我,有更多的地方比其他地方受到伤害。但是,嘿,这是你的软件。

相关问题