gpt4 book ai didi

c# - MVVM、依赖注入(inject)和运行时对象创建

转载 作者:太空宇宙 更新时间:2023-11-03 13:40:37 26 4
gpt4 key购买 nike

在 DI 中,当使用运行时参数在运行时创建不同的对象时,处理对象创建的最佳方式是什么?我读过Mark Seemann's answer regarding using abstract factories效果很好,但我的问题涉及一个场景,其中需要大量抽象工厂来根据调用的命令创建不同的 View 模型。

例如,对于如下描述的应用

存储库层

public interface IMainRepository { }
public interface IOtherRepository { }

服务层

public interface IMainService { }
public interface IOtherService { }

public class MainService : IMainService
{
public MainService(IMainRepository mainRepository)
{
if (mainRepository == null)
{
throw new ArgumentNullException("IMainRepository");
}
_mainRepository = mainRepository;
}

readonly IMainRepository _mainRepository;
}

public class OtherService : IOtherService
{
public OtherService(IOtherRepository otherRepository)
{
if (otherRepository == null)
{
throw new ArgumentNullException("IOtherRepository");
}
_otherRepository = otherRepository;
}

readonly IOtherRepository _otherRepository;
}

查看模型

public class MainViewModel
{
public MainViewModel(IMainService mainService, IOtherViewModelFactory otherViewModelFactory)
{
if (mainService == null)
{
throw new ArgumentNullException("IMainService");
}
_mainService = mainService;

if (otherViewModelFactory == null)
{
throw new ArgumentNullException("OtherViewModelFactory");
}
_otherViewModelFactory = otherViewModelFactory;

InitializeCommonds();
}

readonly IMainService _mainService;
readonly IOtherViewModelFactory _otherViewModelFactory;

public RelayCommand<int> CreateOtherViewModelCommand { get; set; }

void InitializeCommonds()
{
CreateOtherViewModelCommand = new RelayCommand<int>(CreateOtherViewModel);
}

void CreateOtherViewModel(int otherId)
{
var otherVM = _otherViewModelFactory.Create(otherId);

//Do other fantastic stuff...
}
}

public class OtherViewModel
{
public OtherViewModel(IOtherService otherService, int otherId)
{
if (otherService == null)
{
throw new ArgumentNullException("IOtherService");
}
_otherService = otherService;

_otherId = otherId;
}

readonly IOtherService _otherService;
readonly int _otherId;
}

查看模型工厂

public class OtherViewModelFactory : IOtherViewModelFactory
{
public OtherViewModelFactory(IOtherService otherService)
{
if (otherService == null)
{
throw new ArgumentNullException("IOtherService");
}
_otherService = otherService;
}

readonly IOtherService _otherService;

public OtherViewModel Create(int otherId)
{
return new OtherViewModel(_otherService, otherId);
}
}

当从 MainViewModel 调用 CreateOtherViewModelCommand 成员时,IOtherViewModelFactory 抽象工厂依赖项用于创建 OtherViewModel 查看模型。当 MainViewModel 变得不比这更复杂时,这工作得很好。当我在 MainViewModel 中有许多其他命令创建其他 View 模型类型时会发生什么?据我了解,我还需要为那些抽象工厂创建其他抽象工厂,但这不会导致构造函数膨胀,因为所有这些抽象工厂依赖项都是通过构造函数注入(inject)提供的吗?想象一下我需要十个不同的抽象工厂来创建不同类型的 View 模型的情况!有没有更好的方法来实现我想要实现的目标?谢谢。

最佳答案

您已经达到了 IoC 容器(如 Ninject)的地步会对你有用。您定义具体实现如何映射到您的接口(interface),然后向 IOC 容器请求一个对象。它会继续为您构造对象,并提供所有适当的实现。

关于c# - MVVM、依赖注入(inject)和运行时对象创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17171622/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com