【问题标题】:Ninject is finding multiple bindings for implicit self bindings after upgrade to ReactiveUI 7.2升级到 ReactiveUI 7.2 后,Ninject 正在为隐式自绑定找到多个绑定
【发布时间】:2017-04-24 22:10:41
【问题描述】:

我通过Ninject 在这样的对象上注入了工厂绑定。

[Inject]
public Func<TNewDocument> DocumentFactory { get; set; }

我们这样称呼它

var newDoc = DocumentFactory()

第一次调用 DocumentFactory() 成功。

随后的调用导致 Ninject 报告在激活点有多个TNewDocument 绑定。

我修改了我的代码直接调用内核而不是使用工厂。我做了

var docs Kernel.GetAll<TNewDocument>().ToList();
if(docs.Count!=1){
    Console.WriteLine("boo");
}
return docs[0]; // A work around to stop the app crashing

我检查了GetAll 调用实际返回的对象数量。每次调用创建新对象时,此数字都会增加。

第一次返回一个对象。第二次两个对象,第三次三个等等。

我们 git 将存储库一分为二以发现重大更改。这是对ReactiveUI 7.1 to 7.2 的升级。除了 nuget 所做的更改之外,没有其他代码更改。

然而 ReactiveUI 只和 Ninject 有一个基本的关系。我必须为 RxUI 提供一个服务定位器,如下所示。

var customResolver = new FuncDependencyResolver(
    (service, contract) =>
    {
        if (contract != null) return kernel.GetAll(service, contract);
        var items = kernel.GetAll(service);
        var list = items.ToList();
        return list;
    },
    (factory, service, contract) =>
    {
        var binding = kernel.Bind(service).ToMethod(_ => factory());
        if (contract != null) binding.Named(contract);
    });

Locator.Current = customResolver;

除了there is no relation

我不明白为什么升级 RxUI 会导致这个问题。有什么想法吗?

【问题讨论】:

    标签: c# ninject reactiveui


    【解决方案1】:

    这是最新版本中引入的 ReactiveUI 中的错误/重大更改。

    https://github.com/reactiveui/ReactiveUI/pull/1282

    我用

    覆盖了默认的 ReactiveUI 视图定位器
        /// <summary>
        /// Due to bugs / magic in the ReactiveUI view locator we write our own.
        /// The ReactiveUI view locator causes errors if the ViewModel name
        /// doesn't end with "ViewModel". It ends up thinking the ViewModel
        /// and the View are the same class and then very bad stuff happens.
        /// </summary>
        public class WeinCadViewLocator : IViewLocator
        {
            private readonly IKernel _Kernel;
    
            public WeinCadViewLocator(IKernel kernel)
            {
                _Kernel = kernel;
            }
    
            public IViewFor ResolveView<T>(T viewModel, string contract = null) where T : class
            {
                Type generic = typeof(IViewFor<>);
                Type[] args = new[] {viewModel.GetType()};
                var realType = generic.MakeGenericType( args );
    
                if (contract == null)
                {
                    return (IViewFor) _Kernel.Get( realType );
    
                }
                else
                {
                    return (IViewFor) _Kernel.Get( realType, contract );
                }
    
            }
        }
    

    现在正在初始化

        public static void Init(IKernel kernel)
        {
            var customResolver = new FuncDependencyResolver
                (
                 (service, contract) =>
                 {
                     if (contract != null)
                         return kernel.GetAll( service, contract );
                     var items = kernel.GetAll( service );
                     var list = items.ToList();
                     return list;
                 }
                 , (factory, service, contract) =>
                 {
                     var binding = kernel
                          .Bind( service )
                          .ToMethod( _ => factory() );
                     if (contract != null)
                         binding.Named( contract );
                 } );
    
    
            Locator.CurrentMutable.InitializeSplat();
            Locator.CurrentMutable.InitializeReactiveUI();
            Locator.CurrentMutable = customResolver;
            Locator.CurrentMutable
                .RegisterLazySingleton
                  (() => new WeinCadViewLocator(kernel)
                  , typeof(IViewLocator));
    
            var log = SerilogExtensions.DefaultLogger;
            Log.Logger = log;
            SerilogSplatLogger.Register(log);
        }
    

    【讨论】:

      猜你喜欢
      • 2015-12-07
      • 2016-12-21
      • 2020-12-30
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 2017-06-18
      相关资源
      最近更新 更多