[英]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.