7

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 を正しい方法で使用する方法を完全には理解していません。私は何か別の方法で物事を行うべきかもしれません。とにかく、レジストリ コンストラクターに早期に登録されたタイプのインスタンスを取得できますか?

4

1 に答える 1

10

今日も同じ問題に遭遇しました。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.
    }
}

すべての設定を独自のレジストリに移動し、依存レジストリの前に設定レジストリが構成されるようにしました。

お役に立てれば。

于 2009-09-03T17:44:56.283 に答える