2016-12-02 14 views
0

私たちはDIコアとASPコアを使用する必要があるプロジェクトを持っています。 私はこれにはとても新しいので、質問があります。コンストラクタによる依存性注入パスパラメータ

public class HomeController : BaseController { 

    private IOrderService _orderService; 

    public HomeController(IOrderService orderService) { 
     _orderService = orderService; 
    } 

    public IActionResult Index() { 
     var orders = _orderService.GetMyOrders(); 
     return View(orders); 
    } 

} 

コードは次のようになります:

public class OrderService : BaseService, IOrderService { 

    public OrderService(IDataContextService dataContextService) { 
     _dataContextService = dataContextService; 
    } 

    public List<Orders> GetMyOrders() { 

     var orders = // do my code here which works fine!; 

     // here i need some code do check orders for delivery so 
     DeliveryService deliveryService = new DeliveryService(_dataContextService); 

     // update my orders and return these orders 


     return orders; 

    } 

} 

public class DeliveryService : BaseService, IDeliveryService { 

    public DeliveryService(IDataContextService dataContextService) { 
     _dataContextService = dataContextService; 
    } 

    public void MyMethod() { 

    } 

} 

public class BaseService { 
    protected IDataContextService _dataContextService; 
} 

は、ほとんどすべての私のサービスがOrderServiceのとDeliveryServiceのようなコンストラクタを持って

は、私はこのようにHomeControllerという名前のコントローラを持っています。私の質問は、毎回_dataContextServiceを渡さなければならないのか、それとも依存関係のパターン内に解決策があるのでしょうか?

+0

のオブジェクトのインスタンスを1つだけ作成されます

public void ConfigureServices(IServiceCollection services) { // Add framework services. // Add application services. services.AddTransient<HomeController>(); services.AddTransient<IOrderService , OrderService >(); services.AddTransient<IDeliveryService, DeliveryService>(); services.AddScoped<IDataContextService , YourDataContextService >(); } 

以下のようにあなたがStartupクラス内部ConfigureServices方法でコンテキストやサービスを登録することができ、あなたは尋ねている場合コンストラクタインジェクションのほかに依存性インジェクションメソッドがありますか? – BradleyDotNET

+0

ほとんどすべてのサービスは、同じパラメータを持つ同じコンストラクタを持っています。したがって、私がCustomerSerivceを使用し、CustomerService内で他のいくつかのサービスを呼び出す必要がある場合、それらをインスタンス化して、サービスのコンストラクタ内でパラメータを渡す必要があります。私はDIを使用するため、多分別の方法でサービスをインスタンス化できると思った。 –

+3

あなたが探しているのはサービスコンテナです。サービスコンテナには、IXを実装するオブジェクトが必要な場合は、この型(X)を使用するか、またはX型のオブジェクトを返すこの関数を使用するというだけのクラスがあります。十分な情報を伝えると、そのままで。 Autofac、StructureMap、DryIocを見てください。このパターンには多くの実装があります。 –

答えて

1

あなたが求めていることを正しく理解している場合は、IoCコンテナを探しています。 .NET Coreは依存性注入をサポートしています。基本的には、インターフェイスが要求されたときにどの実装を提供するかを指定するだけです。次に、コンテナがタイプをインスタンス化します。例えば、https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/dependency-injectionを参照してください。

あなたはあなたがそれを持っている方法とasp.netコアIoCのはあなたのためにそれを注入したが、それは要求ごとに注入されていることを確認します、それを維持する必要があり

1

に役立ちます希望は、これは1つだけのコンテキストをinsantiateするのに役立ちます各要求を処理し、要求が処理された後に処理します。

AddScoped方法は、各HTTPリクエスト