1

我安装在我的 .NET 项目中:

  • MvvmLight v5.4.1.1
  • 城堡.温莎 v5.0.0
  • CommonServiceLocator v2.0.2
  • CommonServiceLocator.WindsorAdapter.Unofficial v3.3.0

然后我像这样初始化我的容器

public ViewModelLocator()
{
    var container = new WindsorContainer();
    ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(container));
    container.Register(Component.For<MainViewModel>().ImplementedBy<MainViewModel>());
}

这给出了这个错误:

'ServiceLocatorImplBase' 类型是在未引用的程序集中定义的。您必须添加对程序集“Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”的引用。

基本上,MvvmLight v5.4.1.1 期望 CommonServiceLocator v2.0.2,CommonServiceLocator.WindsorAdapter.Unofficial 期望 CommonServiceLocator v1.3.0,CommonServiceLocator.WindsorAdapter 期望 CommonServiceLocator v1.0.0

一种解决方案是将 CommonServiceLocator 降级到 v1.3.0 并且它可以工作,但随后 MvvmLight 也会降级到 v5.3.0

这样做的正确方法是什么?如何让 MvvmLight 和温莎城堡一起工作?

4

1 回答 1

1

对不起,迟到的答案 - 就在今天遇到了同样的问题。并有一个可行的解决方案。是的,降级将起作用。并将阻止以后的 MvvmLight 更新或其他内容。当您的项目肯定需要 CommonServiceLocator 版本 ^2.0.2 时,您可以将未“死”的 WindsorServiceLocator 适配器(用于 CommonServiceLocator v1)替换为 CommonServiceLocator v2 所需的另一个适配器。所以……CommonServiceLocator.ServiceLocator.SetLocatorProvider期待delegate IServiceLocator。然后我们需要一个适配器,它将现有的包装WindsorContainer containerIServiceLocator类型中并将其作为委托返回。

感谢@zshewmaker ( https://github.com/zshewmaker ) 有他的代码。请检查https://gist.github.com/zshewmaker/1074903以获取包装源。

那么您的代码可能如下:

//existing *.cs
public ViewModelLocator()
{
    var container = new WindsorContainer();
    container.Register(Component.For<MainViewModel>().ImplementedBy<MainViewModel>());
    ServiceLocator.SetLocatorProvider(() => new CastleServiceProvider(container));
}

CastleServiceProvider以这种方式实现的地方:

//new CastleServiceProvider.cs
public class CastleServiceProvider : IServiceLocator
{
    private readonly IWindsorContainer container;

    public CastleServiceProvider(IWindsorContainer container)
    {
        this.container = container;
    }

    public object GetService(Type serviceType)
    {
        return container.Resolve(serviceType);
    }

    public object GetInstance(Type serviceType)
    {
        return container.Resolve(serviceType);
    }

    public object GetInstance(Type serviceType, string key)
    {
        return container.Resolve(key, serviceType);
    }

    public IEnumerable<object> GetAllInstances(Type serviceType)
    {
        return (object[])container.ResolveAll(serviceType);
    }

    public TService GetInstance<TService>()
    {
        return container.Resolve<TService>();
    }

    public TService GetInstance<TService>(string key)
    {
        return container.Resolve<TService>(key);
    }

    public IEnumerable<TService> GetAllInstances<TService>()
    {
        return container.ResolveAll<TService>();
    }
}
于 2021-03-20T12:41:14.700 回答