Unity.Resolve 对于具有依赖项注入的 class
Unity.Resolve for a class with a dependency injection
我在我的 Xamarin Forms 应用程序中使用 Unity 来控制依赖注入。我有一个视图模型 class,它将父 ID 和一个统一注入服务作为构造函数参数。
public class BrowseViewModel {
public BrowseViewModel(int parentId, IInjectedService injectedService) {
}
}
我已经在unity容器中注册了class
unityContainer.registerType<BrowseViewModel>();
我在unity容器里也注册了服务
unityContainer.registerType<IInjectedService, InjectedService>();
我的问题是,当 Unity 创建我的 class 实例时,如何指定 parentId
的值?我认为我不必指定 injectedService
参数,因为我已经统一注册了这个 class 并且它是一个单例 class.
您需要这样注册BrowseViewModel
:
container.RegisterType<Func<int, BrowseViewModel>>(
new InjectionFactory(c =>
new Func<int, BrowseViewModel>(id=> c.Resolve<BrowseViewModel>(new ParameterOverrides { { "parentId", id},))));
然后在你使用Browse ViewModel的contrutor中,你需要使用Func<int, BrowseViewModel> browseViewMdoelFactory
并像这样使用它:
class SomeViewClass
{
SomeViewClass(Func<int, BrowseViewModel> browseViewMdoelFactory)
{
browsceViewModelFactory(parentId);
}
}
你有几个选择。您可以像这样注册您的 BrowserViewModel:
unityContainer.RegisterType<BrowseViewModel>(new InjectionFactory(c => new BrowseViewModel(1234, c.Resolve<IInjectedService>())));
但是这样你就有了 parentId
的固定值(本例中为 1234)。
您也可以像这样使用工厂设计模式:
public class BrowseViewModelFactory
{
private IInjectedService _injectedService;
public BrowseViewModelFactory(IInjectedService injectedService)
{
_injectedService = injectedService;
}
public BrowseViewModel CreateBrowseViewModel(int parentId)
{
return new BrowseViewModel(parentId, _injectedService);
}
}
然后你在 class 中注入 BrowseViewModelFactory
你需要 BrowseViewModel
并使用正确的 parentId
调用创建方法。喜欢:
public class SomeOtherClass
{
private BrowseViewModelFactory _browseViewModelFactory;
public SomeOtherClass(BrowseViewModelFactory browseViewModelFactory)
{
_browseViewModelFactory = browseViewModelFactory;
}
public void DoStuff()
{
var browseViewModel = _browseViewModelFactory.CreateBrowseViewModel(4321);
}
}
此外,您可以在尝试解析 BrowserViewModel
时设置 parentId
。
一开始只要注册类型:
container.RegisterType<BrowseViewModel>();
// Mark that InjectedService is the singleton using ContainerControlledLifetimeManager
container.RegisterType<IInjectedService, InjectedService>(new ContainerControlledLifetimeManager());
然后解析类型。为此,您需要在尝试解析类型时覆盖构造函数中的所有原始类型,因此您可以使用 ParameterOverrides
正如@Crekate在答案中指出的那样,或者可以直接将 params ParameterOverride
放在下面的代码中:
var vm = container.Resolve<BrowseViewModel>(new ParameterOverride("parentId", 546));
我在我的 Xamarin Forms 应用程序中使用 Unity 来控制依赖注入。我有一个视图模型 class,它将父 ID 和一个统一注入服务作为构造函数参数。
public class BrowseViewModel {
public BrowseViewModel(int parentId, IInjectedService injectedService) {
}
}
我已经在unity容器中注册了class
unityContainer.registerType<BrowseViewModel>();
我在unity容器里也注册了服务
unityContainer.registerType<IInjectedService, InjectedService>();
我的问题是,当 Unity 创建我的 class 实例时,如何指定 parentId
的值?我认为我不必指定 injectedService
参数,因为我已经统一注册了这个 class 并且它是一个单例 class.
您需要这样注册BrowseViewModel
:
container.RegisterType<Func<int, BrowseViewModel>>(
new InjectionFactory(c =>
new Func<int, BrowseViewModel>(id=> c.Resolve<BrowseViewModel>(new ParameterOverrides { { "parentId", id},))));
然后在你使用Browse ViewModel的contrutor中,你需要使用Func<int, BrowseViewModel> browseViewMdoelFactory
并像这样使用它:
class SomeViewClass
{
SomeViewClass(Func<int, BrowseViewModel> browseViewMdoelFactory)
{
browsceViewModelFactory(parentId);
}
}
你有几个选择。您可以像这样注册您的 BrowserViewModel:
unityContainer.RegisterType<BrowseViewModel>(new InjectionFactory(c => new BrowseViewModel(1234, c.Resolve<IInjectedService>())));
但是这样你就有了 parentId
的固定值(本例中为 1234)。
您也可以像这样使用工厂设计模式:
public class BrowseViewModelFactory
{
private IInjectedService _injectedService;
public BrowseViewModelFactory(IInjectedService injectedService)
{
_injectedService = injectedService;
}
public BrowseViewModel CreateBrowseViewModel(int parentId)
{
return new BrowseViewModel(parentId, _injectedService);
}
}
然后你在 class 中注入 BrowseViewModelFactory
你需要 BrowseViewModel
并使用正确的 parentId
调用创建方法。喜欢:
public class SomeOtherClass
{
private BrowseViewModelFactory _browseViewModelFactory;
public SomeOtherClass(BrowseViewModelFactory browseViewModelFactory)
{
_browseViewModelFactory = browseViewModelFactory;
}
public void DoStuff()
{
var browseViewModel = _browseViewModelFactory.CreateBrowseViewModel(4321);
}
}
此外,您可以在尝试解析 BrowserViewModel
时设置 parentId
。
一开始只要注册类型:
container.RegisterType<BrowseViewModel>();
// Mark that InjectedService is the singleton using ContainerControlledLifetimeManager
container.RegisterType<IInjectedService, InjectedService>(new ContainerControlledLifetimeManager());
然后解析类型。为此,您需要在尝试解析类型时覆盖构造函数中的所有原始类型,因此您可以使用 ParameterOverrides
正如@Crekate在答案中指出的那样,或者可以直接将 params ParameterOverride
放在下面的代码中:
var vm = container.Resolve<BrowseViewModel>(new ParameterOverride("parentId", 546));