5

Autofac について読んだことがありますが、それは高速です。コーディングが含まれているのを見てきましたが、かなりきれいです。しかし、私はそれを使用する方法がよくわかりません。私は StructureMap を使用しましたが、これには静的な ObjectFactory があります。Ninjectにはカーネルがありますが、AutofacのGoogleページでは、次のようなことを推奨しています:

using( var resolver = builder.Build() ){
   var whatINeed = resolver.Resolve<INeedThisService>();
}

これはWinFormsアプリなので、上記を実行して無効なオブジェクト状態になったので、グローバルIContainerに切り替えて、このようにしました

 using( var resolver = Program.Container.CreateInnerContainer() )
 {
     var whatINeed = resolver.Resolve<INeedThisService>();
 }

3、5回ほど使用しました。しかし、それは効率的ですか?または、次のようなことをする必要があります

 var whatINeed = Program.Resolve<INeedThisService>()

そしてカバーの下

 internal static TServervice Resolver<TService>(){
       if(_container == null ) _container = builder.Build();
       return _container.Resolve<TService>();
 }

どちらを使用しますか?なぜですか? また、CreateInnerContainer() を使用した場合のペナルティはありますか?

4

3 に答える 3

9

私は AutoFac の専門家ではありませんが、他の Ioc コンテナーの経験はあります。この質問は、AutoFac を試す理由になると思いました。

Ioc コンテナに基づく設計では、エントリ ポイントまたはホスト レベルを除き、すべてのコードがコンテナにアクセスできないように分離するよう努める必要があります。AutoFac と WinForms を使用して次の例を作成し、フォームがコンストラクターを介してサービスにアクセスする方法を示しました。

なぜ内側の容器が必要だと思ったのかよくわかりません。コメントいただければ、より詳細な回答を提供できるかもしれません。

static class Program
{
    [STAThread]
    static void Main()
    {
        var builder = new ContainerBuilder();
        builder.Register<TheService>().As<INeedThisService>();
        builder.Register(f => new Form1(f.Resolve<INeedThisService>())).As<Form1>();

        using (var container = builder.Build())
        {
            Application.Run(container.Resolve<Form1>());
        }

    }
}

public interface INeedThisService { }

public class TheService : INeedThisService
{
    public TheService() { Console.WriteLine("ctor ThisService"); }
}

public partial class Form1 : Form
{
    public Form1(INeedThisService service)
    {
        Console.WriteLine("ctor Form1");
        InitializeComponent();
    }
}
于 2009-06-10T19:30:04.420 に答える
3

Mark Lindellが指摘したように、通常、Autofacアプリケーションでコンテナに直接アクセスする必要はありません。

推奨されるアプローチは、アプリケーションの起動時にMarkが行ったように、一度アクセスすることです。

その後オブジェクトを作成する必要がある他のコンポーネントは、Autofacが自動的に挿入するIContext型のコンストラクターパラメーターを宣言できます。

Autofacアセンブリへの依存を必要としない別の方法は、http ://code.google.com/p/autofac/wiki/DelegateFactoriesで説明されているように生成されたファクトリを使用することです。

お役に立てれば!

于 2009-08-01T20:44:01.160 に答える