【问题标题】:Constructor chaining and static property parameter and StructureMap构造函数链接和静态属性参数和 StructureMap
【发布时间】:2011-06-06 10:08:58
【问题描述】:

我希望我的构造函数调用另一个带参数的构造函数,但是当我这样做(MyProperty)时,MyProperty 必须是静态的。问题出在这个静态属性的获取器中,我必须从结构映射容器中获取 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上发现了类似的问题,但他没有使用结构映射: Constructor chaining with intermediate variables

【问题讨论】:

    标签: c# constructor structuremap


    【解决方案1】:

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

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

    您可以删除其余部分。

    您从结构映射中得到的异常是因为您没有为 ISettingReader 配置任何默认实例

    【讨论】:

    • 你是绝对正确的。我以为我很了解结构图,但实际上不是-_-。不过还是非常感谢 thekip,你是 C# 开发之神。
    猜你喜欢
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2010-09-12
    • 1970-01-01
    • 2014-03-14
    • 2011-02-20
    相关资源
    最近更新 更多