2017-09-13 7 views
1

コンソールアプリケーションでAutofacを使用したいと考えています。それは私の本当の最初の使い方です。それ以前はASP.NET MVCでのみ使用していました。 MVCプロジェクトでは、Global.asaxでAutofacをセットアップし、コントローラにIServiceを注入することができます。コンソールアプリケーションで は、私は以下のようにそれを実行します。それのコンソールアプリケーションのオートファンクション(コンベンション)

internal class Program 
{ 
    private static IContainer Container { get; set;} 

    private static void Main(string[] args) 
    { 
     Container = Container.Configure(); // here I have all necessary objects set 
     // now I can use it in Main method as: 
     using (var scope = Container.BeginLifetimeScope()) 
     { 
      scope.Resolve<ISomething>(); 
     } 
    } 
} 

あなたが見ることができるように使用量がちょうどメイン方法が単純です。それを外部クラスで使うのはどうですか?クラス猫を作成し、その中にオートファックを使用したいとしましょう。クラスプログラムのコンストラクタオブジェクトContainerに渡す必要がありますか?例:

Cat cat = new Cat(Program.Container, "Molly"); 

Catクラス内にIContainerを作成する必要がありますか?

最適なソリューションは何ですか?

答えて

4

コンソールアプリケーションだけが実際にオートファックについて知る必要があります。そうしないと、サービスパターンが落ちてしまいます。これはしばしばアンチパターンと見なされます。代わりに、あなたのアプリケーションがこのパターンに従ってください:私は実際にコンストラクタを呼び出すことはありません

//in your console application 
using (var scope = Container.BeginLifetimeScope()) 
{ 
    IServiceservice = scope.Resolve<IService>(); 
    service.Execute(); 
} 

class SomeService : IService 
{ 
    readonly ISomeDependency _dependency; 

    public SomeService(ISomeDependency dependency) 
    { 
     _dependency = dependency; 
    } 

    public void Execute() 
    { 
     _dependency.DoSomething(); 
    } 
} 

interface IService 
{ 
    void Execute(); 
} 

注意してください。私は、そのオブジェクトが単なるPOCO(データのみ、論理なし)でない限り、オブジェクトを決して "新しくする"ことを習慣にします。

ISomeDependencyは、それ自体がコンストラクタインジェクションによって0以上の他のクラスに依存することに注意してください。 AutoFacはIServiceを作成し、そのすべての依存関係はISomeDependencyを含むので、ISomeDependencyの依存関係もすべて初期化されます。このコンセプトを示す良いビデオは、Miguel CastroのDeep Dive into Dependency Injection and Writing Decoupled Quality Code and Testable Softwareです。

+0

メーソン、貴重な答えをありがとう。最初の投稿から私の問題を広げたいと思います。あなたが書いたように、メインメソッドの中にオブジェクトを作ることができます。私は他のクラスでオートファックを使いたいのですが? AutoFacを使用して注入: のは、私はいくつかの他のサービスを利用したいクラス 'パブリッククラスEmployeeService { 公務員GETEMPLOYEE(小数点以下ID) ここ{// があるとしましょう。 //ここでもう一度コンテナオブジェクトを作成し、次に: //(var scope = Container.BeginLifetimeScope()){...}を使用する必要があります } } ' – cube

+0

@キューブあなたが何を求めているのか分かりません今。はい、AutoFacでオブジェクトのインスタンスを作成し、コンストラクタインジェクションを介してオブジェクトを注入することができます。 – mason

+0

私は私の控えめと混同します。しかし、あなたは私の疑問に答えました。ありがとうございました。 – cube

関連する問題