1

.NET プロジェクトにインストールしました。

  • MvvmLight v5.4.1.1
  • Castle.Windsor 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 を想定しています。

1 つの解決策は、CommonServiceLocator を v1.3.0 にダウングレードすることです。これは機能しますが、MvvmLight も v5.3.0 にダウングレードされます。

これを行う正しい方法は何ですか?MvvmLight と Windsor Castle を連携させるにはどうすればよいですか?

4

1 に答える 1

1

回答が遅くなり申し訳ありません-今日も同じ問題が発生しました。そして、実用的な解決策があります。はい、ダウングレードは機能します。後で MvvmLight の更新などをブロックします。プロジェクトで CommonServiceLocator バージョン ^2.0.2 が確実に必要になる場合は、'死んでいない' WindsorServiceLocator アダプター (CommonServiceLocator v1 用) を、CommonServiceLocator v2 に必要な別のアダプターに置き換えることができます。だから...CommonServiceLocator.ServiceLocator.SetLocatorProvider期待してdelegate IServiceLocatorいます。次に、既存WindsorContainer containerのものをIServiceLocator型にラップし、それをデリゲートとして返すアダプターが必要になります。

@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 に答える