簡體   English   中英

通用實現,但構造函數參數取決於具體類

[英]Generic implementation, but constructor arguments depend on concrete class

在通用類中,我必須創建一個相同類型的新對象:

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");

我想知道正確的方法是什么。 封裝用於創建對象的參數? 工廠模式? 還是應該避免在那種情況下繼承並堅持合成?

我也可以始終通過“所有”服務。 或提供可以訪問所有服務的類。 但是我想那是個壞主意。

我對您的體系結構的其余部分不太了解,但這是我的考慮因素:

如果我已經使用DI:每個服務/類型引導配置的大多數容器支持。 只要您在撰寫過程中不開始做動態工作,就應該保持相當全面

否則:傳遞Func<ViwModel<T>>工廠方法(作為基類的構造函數參數)。 這可能是您要做的最簡單,最干凈的方法。

正如您指出的那樣,傳遞所有服務(很快就會造成無法維護的混亂)並不是一個好主意。 關於服務定位器模式(引用您“或提供一個提供對所有服務的訪問權限的類”),這是一個非常有思想的討論,在那邊有一些很好的見解: ServiceLocator是反模式嗎? 如果你問我; 反之,危害更大的地方更多。 但是,這是您的軟件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM