3

我正在努力使用 Ninject 的工厂扩展。

将扩展与 InCallScope 结合使用时,我希望从工厂的 create 方法返回相同的实例,但我得到了两个不同的实例。

我误解了 InCallScope 概念还是需要添加其他内容?

using System;
using Ninject;
using Ninject.Extensions.Factory;
using Ninject.Extensions.NamedScope;

namespace MyTest
{
    class Program
    {
        static void Main()
        {
            var kernel = new StandardKernel();

            kernel.Bind<IMyFactory>().ToFactory();

            // Does not give what I want, not a surprise...
            // kernel.Bind<IMyStuff>().To<MyStuff1>().InTransientScope();

            // Works - of course, but I don't want a singleton. It should only be used in call scope...
            // kernel.Bind<IMyStuff>().To<MyStuff1>().InSingletonScope();

            kernel.Bind<IMyStuff>().To<MyStuff>().InCallScope();

            var myFactory = kernel.Get<IMyFactory>();

            // Creating my first instance...
            var myStuff1 = myFactory.Create();

            // Creating my second instance...
            var myStuff2 = myFactory.Create();

            // 
            if (myStuff1.SeqNo != myStuff2.SeqNo)
                throw new Exception("Except them to be equal...");
        }
    }

    public interface IMyFactory
    {
        IMyStuff Create();
    }

    public interface IMyStuff
    {
        int SeqNo { get; }
    }

    public class MyStuff : IMyStuff
    {
        private static int _staticSeqNo;

        public MyStuff()
        {
            SeqNo = _staticSeqNo;

            _staticSeqNo++;
        }

        public int SeqNo { get; private set; }
    }
}
4

1 回答 1

2

Ninject.Extensions.ContextPreservation是您的案例缺少的链接 - 当它的模块安装在内核中时,它会将行为更改为您所期望的。

但是等等......它们单独的调用 - 如果它们不是的话,事情会变得非常混乱(没有引用,但与@Remo Gloor 非正式地讨论过)。出于这个原因,Unstable NuGet 包(在撰写本文时)会改变行为以按照您的方式工作。

这个问题和我的两个答案应该能说明问题,并希望能帮助您找到解决方案。寻找行为类似于 InRequestScope 的 Ninject 范围

如果您选择接受它,您的任务是将这些信息传播到 wiki 文章中,使您(和我)困惑于期待其他行为。

于 2013-05-27T10:05:02.330 回答