【问题标题】:StructureMap - Don't Expect Same ObjectStructureMap - 不要期望相同的对象
【发布时间】:2016-02-18 16:26:08
【问题描述】:

我在我的 C# 应用程序中使用结构映射并得到我不理解或不期望的行为。希望有人可以解释我做错了什么或为什么我的期望不正确!

当构造函数接受两个相同类型的参数时,我希望它们是相同类型的不同实例——而不是对相同实例的引用。下面的示例应用程序演示了这一点。

注册表:(不是不使用 Singleton()

    public class DemoRegistry: Registry
    {
        public DemoRegistry()
        {
            For<IController>().Use<Controller>();
            For<IAnInterface>().Use<AClass>();
        }
    }

我的注入类型:

public interface IAnInterface { }

public class AClass : IAnInterface {}

说明问题的类(我不希望 obj1 等于 obj2):

public interface IController {}

public class Controller : IController
{
    private readonly IAnInterface _obj1;
    private readonly IAnInterface _obj2;

    public Controller(IAnInterface obj1, IAnInterface obj2)
    {
        _obj1 = obj1;
        _obj2 = obj2;
        bool sameObject = ob1 == obj2; // this is TRUE
    }
}

最后是运行它的 Main 方法:

    static void Main(string[] args)
    {
        ObjectFactory.Configure(x => x.AddRegistry<DemoRegistry>());
        IController c = ObjectFactory.GetInstance<IController>();
    }

我正在使用 .Net 4.0 和 StructureMap 2.5.4。

总结一下:

  • 为什么上面示例中的 obj1 == obj2?

希望这很清楚,如果需要,我很乐意提供更多信息。

【问题讨论】:

    标签: c# structuremap


    【解决方案1】:

    要在每次需要某个类型的实例时创建一个新实例,请使用unique lifetime

    var unique = new UniquePerRequestLifecycle();
    x.For<IAnInterface>().LifecycleIs(unique).Use<AClass>();
    

    【讨论】:

    • 谢谢@georg。我会在早上尝试这个并接受它是否有效。不确定我是否理解为什么需要这样做,我对 Structure map DSL 的理解是它说“如果您被要求提供其中之一,则实例化其中之一”。当然,除非我使用过 For .Singleton ().Use ()
    猜你喜欢
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多