2017-06-15 4 views
0

人、私はAsp.netコアを学習しています。私は、サービスタイプのインスタンスを作成する方法の選択に直面しました。 WCFを使用している間、私が書くために使用されるいくつかのコードがあります。上記のコードでasp.netコアで手動ではなく依存性注入を使用してインスタンスを作成する理由

public class SomeService:ISomeService 
{ 
    [WebInvoke(UriTemplate="action1")] 
    public void DoSomething1() => new DBAccessBroker1().DoSomethingWithDB(); 

    [WebInvoke(UriTemplate="action2")]   
    public void DoSomething2() => new DBAccessBroker2().DoSomethingWithDB(); 
} 

私はサービスインスタンスSomeServiceを作成中DBAccessBrokerのインスタンスを作成します。さて、Asp.netコアで、同じfuntionalityは次のように依存性注入を使用して実装することができます:明らかに

public class Startup 
{ 
    ... 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddSingleton<DBAccessBroker1>(); 
     services.AddSingleton<DBAccessBroker2>(); 
     ... 
    } 
    ... 
} 
public class SomeController : Controller 
{ 
    DBAccessBroker1 broker1=null; 
    DBAccessBroker2 broker2=null; 
    public SimeController(DBAccessBroker1 broker1,DBAccessBroker2 broker2) 
    { 
     this.broker1=broker1; 
     this.broker2=broker2; 
    } 

    [HttpPost("action1")] 
    public void DoSomething1()=>broker1.DoSomethingWithDB(); 

    [HttpPost("action2")] 
    public void DoSomething2()=>broker2.DoSomethingWithDB(); 
} 

DIサービスを登録する必要がないので、それは手動でDIを使用するよりも、インスタンスを作成するために、より簡潔だと空気から来るかのようにパラメータを持つ奇数のコントローラコンストラクタを記述します。

一方、MicrosoftがDIをAsp.Netコアに組み込むためには、メリットがあるはずです。 DIはキャッシュや再利用可能なメカニズムのような機能で実装されるべきだと思います。しかし、私はそれを確認するためのいくつかの文書を見つけることに失敗した。だから私は、内部の人や深い理解を持つ人の中にDIの根底にある原則を教えてくれるのだろうかと思っていました。私は私の場合は手動ではなくDIを使用して自分のサービスタイプのインスタンスを作成することに納得する必要があります。あなたはブローカーconstroctorsに渡す必要があるパラメータを気にしてはならない

1):DIを使用して

+0

[依存性注入とは何ですか?](https://stackoverflow.com/questions/130794/what-is-dependency-injection)の可能な複製 – NightOwl888

答えて

2

は、あなたのケースに少なくとも2つの長所を持っています。使用準備が整ったインスタンスを受け取りますが、作成ロジックは他の場所(Startup.csまたはカスタムファクトリ)にあります。

2)DIは、同じユーザー要求を処理する際に、同じブローカインスタンスをコントローラや他のサービスに渡すことができます。スコープライフタイムで登録すると、他のインスタンスを他の要求を処理する(同時に)

この「機能」が必要ない場合は、ブローカーを「手動で」作成することができます。

関連する問題