【问题标题】:How can I get an instance in StructureMap Registy constructor?如何在 StructureMap Registy 构造函数中获取实例?
【发布时间】:2010-11-19 22:21:05
【问题描述】:

如何在 StructureMap Registy 构造函数中获取某种类型的实例(在不同的注册表中注册)?我想用这样的代码:

    public RepositoriesRegistry()
    {
        IApplicationSettings lApplicationSettings =
            ObjectFactory.GetInstance<IApplicationSettings>();
        Debug.Assert(lApplicationSettings != null);

        const string cSupportedDevicesConnectionString =
            "metadata=res://*/Models.SupportedDevices.Database.SupportedDevicesModel.csdl|res://*/Models.SupportedDevices.Database.SupportedDevicesModel.ssdl|res://*/Models.SupportedDevices.Database.SupportedDevicesModel.msl;provider=System.Data.SqlClient;provider connection string=\"{0}\"";
        string lSupportedDevicesConnectionString =
            string.Format(cSupportedDevicesConnectionString, lDatabaseConnectionString);
        SupportedDevicesEntities lSupportedDevicesEntities =
            new SupportedDevicesEntities(lSupportedDevicesConnectionString);
        ForRequestedType<SupportedDevicesEntities>().TheDefault.IsThis(
            lSupportedDevicesEntities);
        ForRequestedType<ISupportedDevicesRepository>().TheDefault.IsThis(
            new SupportedDevicesRepository(lSupportedDevicesEntities));

    }

IApplicationSettings 是应用程序设置的接口。实现此接口的具体类型(当前为 ConfigFileApplicationSettings 类)在另一个注册表中注册,如下所示:

    public ApplicationServicesRegistry()
    {
        ForRequestedType<IApplicationSettings>().TheDefault.IsThis(
            new ConfigFileApplicationSettings());
    }

并且两个注册表都在 Bootstrapper 中注册:

        #region IBootstrapper Members

    public void BootstrapStructureMap()
    {
        ObjectFactory.Initialize(InitalizeStructureMapContainer);
    }

    #endregion

    #region Private properties

    private static bool HasStarted { get; set; }

    #endregion

    #region Private methods

    private void InitalizeStructureMapContainer(IInitializationExpression x)
    {
        x.IgnoreStructureMapConfig = true;
        x.AddRegistry<ViewModelRegistry>();
        x.AddRegistry<ApplicationServicesRegistry>();
        x.AddRegistry<RepositoriesRegistry>();
        x.AddRegistry<DataOperationsRegistry>();
    }

    #endregion

当我尝试在注册表构造函数中获取 IApplicationRegisty 的实例时,我遇到了错误(当然)。我不完全了解如何以正确的方式使用 StructureMap。也许我应该以不同的方式做这件事。但无论如何,我能否在 Registry 构造函数中提前注册某种类型的实例?

【问题讨论】:

    标签: .net structuremap


    【解决方案1】:

    我今天遇到了同样的问题。 Jeremy Miller(没有关系:))的答案是 StructureMap 未设置为在配置时创建实例。

    他推荐和我使用的解决方法是为设置创建一个容器。这是我的解决方案。

    public class SettingsRegistry : Registry
    {
        public SettingsRegistry()
        {
            ForRequestedType<ISettingsProvider>().TheDefault.Is.OfConcreteType<AppSettingsProvider>();
    
            Scan(s =>
            {
                s.TheCallingAssembly();
                s.With<SettingsScanner>();
            });
        }
    }
    
    public class RegistryNeedingSettings : Registry
    {
        public RegistryNeedingSettings()
        {
            var settingsContainer = new Container(new SettingsRegistry());
            var coreSettings = settingsContainer.GetInstance<CoreSettings>();
    
            //configuration needing access to the settings.
        }
    }
    

    我将所有设置都移到了它自己的注册表中,并确保在依赖注册表之前配置了设置注册表。

    希望这会有所帮助。

    【讨论】:

    • 9年了,想知道你今天是怎么做到的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多