通用实现,但构造函数参数依赖于具体类

时间:2016-11-04 08:32:23

标签: c# generics design-patterns

在泛型类中,我必须创建一个相同类型的新对象:

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;服务。或者提供一个提供所有服务访问权限的类。但我想这些都是糟糕的想法。

1 个答案:

答案 0 :(得分:0)

我不太了解你的其他架构,但这些都是我的考虑因素:

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

其他:传递Func<ViwModel<T>>工厂方法(作为构造函数参数到基类)。这可能是做你想做的最简单,最干净的方式。

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

相关问题