构造函数链接和静态属性参数以及StructureMap

时间:2011-06-06 10:08:58

标签: c# constructor structuremap

我希望我的构造函数使用参数调用另一个构造函数,但是当我这样做(MyProperty)时,MyProperty必须是静态的。问题出在这个静态属性的getter中,我必须从structuremap Container获取一个ISettingReader的实例,因为它是静态的,我的容器只包含两个元素而不是超过50个元素,然后它找不到实例。 (ISettingReader上的pluginFamily错误)

这是我的代码。

    private static Func<LinqDataContext> _contextFactory;
    public static Func<LinqDataContext> DefaultContextFactory
    {
        get
        {
            var settingReader = ObjectFactory.GetInstance<ISettingReader>(); // I get an error saying it can't find ISettingReader()
            var connectionString = settingReader.GetSetting("MyProject.ConnectionString");
            _contextFactory = () => new LinqDataContext(connectionString);
            return _contextFactory;
        }
    }

    public MyProjectViewModelService() : this(DefaultContextFactory)
    {

    }

    public MyProjectViewModelService(Func<LinqDataContext> contextFactory)
    {
        _contextFactory = contextFactory;
    }

我认为如果我可以摆脱我的静态关键字,它应该可行。我确认在Program.exe

中启动应用程序时,我已经在structureMap容器​​中初始化了我的ISettingReader

那我该怎么办? 谢谢!

约翰

PS:我在stackoverflow上发现了类似的问题,但是他没有使用structureMap: Constructor chaining with intermediate variables

1 个答案:

答案 0 :(得分:1)

为什么不将代码从getter移动到默认构造函数,并将ISettingReader作为依赖项放在构造函数中。当您请求新的MyProjectViewModelService时,Structuremap将自动解析ISettingReader并为该依赖项提供实例化的默认类型。

所以,如果你有 public MyProjectViewModelService(ISettingReader settingReader)
{
var connectionString = settingReader.GetSetting("MyProject.ConnectionString");
_contextFactory = () => new LinqDataContext(connectionString);
}

您可以删除其余部分。

您从structuremap获得的异常是因为您没有为ISettingReader配置任何默认实例