【问题标题】:Multiple constructor with Structuremap changing the scope?使用 Structuremap 更改范围的多个构造函数?
【发布时间】:2011-01-20 12:43:41
【问题描述】:

为了说明问题,这里是我的设置的简化版本。 我有一个这样的工厂:

public interface IFactory{ }

public class Factory : IFactory
{
    public Factory()
    {
        Console.WriteLine("parameterless");
    }

    //public Factory(int i)
    //{
    //    Console.WriteLine("with parameter : {0}", i);
    //}

}

测试这个的程序是一个consoleApp。足以证明我的观点。

static void Main(string[] args)
{
     Init();
     var factory1 = ObjectFactory.GetInstance<IFactory>();
     var factory2 = ObjectFactory.GetInstance<IFactory>();
     var factory3 = ObjectFactory.GetInstance<IFactory>();
     Console.Read();
 }

我在我的 Init 静态方法中设置了 strucutreMap。

  public static void Init()
        {
            ObjectFactory.Initialize(x =>
            {
                 //insert Initialization code here.
            });
        }

如果我只有一个构造函数并像这样设置 StructureMap:

x.For<IFactory>().Use<Factory>();

效果很好,输出显示
无参数
无参数
无参数

每次调用都会构建一个新实例。

现在,如果我取消注释第二个构造函数,但我想使用无参数的构造函数,并且具有相同的默认生活方式。我该怎么办?

我试过了:

x.SelectConstructor<IFactory>(() => new Factory());
x.For<IFactory>().Use<Factory>();

它只是不起作用:InstanceKey 缺少请求的实例属性“i”

如果我这样做:

 x.For<IFactory>().Use(new Factory());

它可以工作,但输出只是一个“无参数”,这意味着它不会为每个调用构建一个新实例。它正在使用我传入的这个特定实例。

我发现的唯一方法是在我的无参数构造函数之上添加 [DefaultConstructor] 并使用标准 x.For().Use(); 但我不想添加此属性并将配置分散到我的模型中。

帮助?

【问题讨论】:

    标签: .net structuremap ioc-container object-lifetime


    【解决方案1】:

    SelectConstructor 采用具体类型,而不是接口。当然,接口没有任何构造函数。 但是没有任何问题,它只是被忽略了......所以我无法发现那个错误。

     x.SelectConstructor<IFactory>(() => new Factory());
     x.For<IFactory>().Use<Factory>();
    

    应该是

     x.SelectConstructor<**Factory**>(() => new Factory());
     x.For<IFactory>().Use<Factory>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 2011-01-16
      相关资源
      最近更新 更多