0

アプリケーションのセットアップ (初期化) を行いたいと考えています。でこれを行いGlobal.asax.csます。

目標を達成するには、依存関係 (おそらくリポジトリ) が必要になります。

の実装を注入するにはどうすればよいIFooRepositoryですか?

public class MvcApplication : HttpApplication
{

    private static IFooRepository _fooRepository;

    protected void Application_Start()
    {
        // ...

        IFoo foo = _fooRepository.Get(0);
        foo.DoSomething();
    }

}

私はこれを試しましたが、失敗しました:

public class RepositoriesInstaller : IWindsorInstaller
{
    void IWindsorInstaller.Install(Castle.Windsor.IWindsorContainer container,
        Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
    {
        container.AddFacility<TypedFactoryFacility>();

        container.Register(
            Component.For<IFoo>()
            .ImplementedBy<Foo>()
            .LifestyleTransient(),
            Component.For<IFooRepository>().AsFactory());

        container.Register(Classes.FromThisAssembly()
            .BasedOn<IFooRepository>()
            .WithServiceDefaultInterfaces()
            .LifestyleTransient());
    }
}

構築されていないもの (静的クラス) に依存関係を注入するにはどうすればよいですか?

インターフェイスベースのファクトリのドキュメントを読みましたが、理解できません。

施設とは?それらは何に使用されますか?

4

1 に答える 1

1

は通常、アプリケーションの初期化とすべてのコンポーネントの登録をトリガーするクラスであるためMvcApplication、DI コンテナーに依存関係を注入させることはできません。それに加えて、依存性注入のコンテキストでは、静的を注入することの有用性はかなり制限されているため、コンテナーには静的依存性を注入する組み込みのサポートがありません。

しかし、解決策は実際には非常に単純IFooRepositoryです。構成が完了したら、コンテナーから を解決する必要があります。

ただし、IFooRepositoryシングルトンとして登録したときは、静的フィールドにのみ格納する必要があることに注意してください。そうしないと、(偶然に)それIFooRepositoryをシングルトンに昇格させ、あらゆる種類の問題(同時実行の競合やキャッシュの問題など)を引き起こす可能性があります。

于 2013-07-24T12:12:16.123 に答える