【问题标题】:StructureMap singleton usage (A class implementing two interface)StructureMap 单例用法(一个实现两个接口的类)
【发布时间】:2011-01-22 17:40:44
【问题描述】:
public interface IInterface1
{
}

public interface IInterface2
{
}

public class MyClass : IInterface1, IInterface2
{
}

...

ObjectFactory.Initialize(x =>
{
    x.For<IInterface1>().Singleton().Use<MyClass>();
    x.For<IInterface2>().Singleton().Use<MyClass>();
});

var x = ObjectFactory.GetInstance<IInterface1>();
var y = ObjectFactory.GetInstance<IInterface2>();

我用上面的代码得到了两个不同的 MyClass 实例。我怎样才能得到一个?

【问题讨论】:

    标签: c# singleton structuremap


    【解决方案1】:

    我会注册 MyClass 本身,然后将其从上下文中拉出以用于各个接口的 Use 语句。

    ForSingletonOf<MyClass>().Use<MyClass>();
    
    For<IInterface1>().Use(ctx => ctx.GetInstance<MyClass>());
    For<IInterface2>().Use(ctx => ctx.GetInstance<MyClass>());
    

    【讨论】:

    • 这对我有用! “x.Forward”方法不起作用,我的代码无法解析 IInterface2。
    • @andyhammer 您可能已经交换了两个界面。 FROM 是第一,TO 是第二。我犯了那个错误......很好的解决方案,我认为我的设计很糟糕,这是不可能的,但我想其他人也有同样的问题,感谢上帝。
    • 我觉得这种方式比较干净,我不喜欢把这些接口相互耦合。
    【解决方案2】:

    您可以使用 Forward() 注册来告诉 StructureMap 使用不同类型的解析来解析类型。这应该符合您的预期:

    ObjectFactory.Initialize(x =>
    {
        x.For<IInterface1>().Singleton().Use<MyClass>();
        x.Forward<IInterface1, IInterface2>();
    });
    

    【讨论】:

      【解决方案3】:

      ObjectFactory旨在创建多个实例。如果您想要一个单例,请编写一个单例类(可能使用公共 IInterface1IInterface2 属性作为访问器)。

      这似乎是粗略的记录,但也许您可以改用Container

      【讨论】:

      • 容器(ObjectFactory 或手动创建的容器)可以为您处理对象生命周期 - 无需自己实现单例行为。
      【解决方案4】:

      尝试查看要使用的不同重载,尤其是 Func 重载。从那里您可以知道 StructureMap 应该如何使用已注册的另一个对象创建您的实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-01
        • 2012-06-10
        • 1970-01-01
        • 2020-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多