2017-02-20 67 views
-1

我有一個.NET MVC應用程序,我需要將我的服務傳遞給控制器​​。控制器應該使用該服務,檢索所有儀器並將它們傳遞給視圖。爲了做到這一點,正確的方法是什麼?在.NET MVC框架中將服務傳遞給控制器​​

這裏我的控制器:

public class MyController: Controller 
    { 
     private MyService db; 

     public IActionResult Index() 
     { 
      var res = db.Instrument; 
      return View(res); 
     } 
    } 

我想使用db但它需要以某種方式傳遞。以下MyService服務:

public class MyService : IMyService 
    { 
     private readonly IServiceProvider serviceProvider; 

     public MyService(IServiceProvider serviceProvider) 
     { 
      this.serviceProvider = serviceProvider; 
      Instrument = null; 
     } 

     public Instrument Instrument { get; private set; } 
    } 
+0

原因爲-1? –

+0

對不起,我不明白你的問題。首先,你的代碼在控制器中,你使用一個db變量而不需要啓動。它根本沒有意義。我想你想自動創建實例。是嗎? –

回答

1

首先,我會成立控制器,使其不必創建其依賴做其工作(見Inversion of Control)的對象。

因此,所述控制器可以是這樣的:

public class MyController: Controller 
{ 
    private readonly IMyService myService; 

    public MyController(IMyService myService) 
    { 
     this.myService = myService; 
    } 

    ... 
} 

注意,服務經由控制器構造和該服務接口上的控制器的答覆,而不是實際的服務類型傳遞到控制器。控制器不需要關心服務來自哪裏或者它是如何實現的,只要它符合指定的接口即可。

所以,現在,你可以使用該服務來獲取您的信息:在這裏

public class MyController: Controller 
{ 
    private readonly IMyService myService; 

    public MyController(IMyService myService) 
    { 
     this.myService = myService; 
    } 

    public ViewResult Index() 
    { 
     var instruments = this.myService.GetInstruments(); 
     return View(instruments); 
    } 
} 

請注意,當你在你的描述中指定你想找回我已經改變了你的服務實現檢索所有樂器所有的文書。

此外,請注意,爲了簡單起見,我剛將服務的返回類型直接傳遞給視圖。但是,我通常會推薦使用視圖模型,但我會將其作爲練習留給讀者。

至於服務本身,你可能有:

public class MyService : IMyService 
{ 
    private readonly IDataProvider dataProvider; 

    public MyService(IDataProvider dataProvider) 
    { 
     this.dataProvider = dataProvider; 
    } 

    public IEnumerable<Instrument> GetInstruments() 
    { 
     return dataProvider.GetInstruments(); 
    } 
} 

我不知道什麼是IServiceProvider所以我改名這IDataProvider。你可以隨時隨地獲得服務中的數據。例如,您可以改爲將IDbContext(如果使用實體框架)傳遞給構造函數,並使用它來獲取數據。

我還必須指出,如果您的應用程序對於非常簡單的業務用例場景來說非常簡單,那麼您可能甚至不需要此服務層,並將數據提供程序直接傳遞給構造函數。再次,我會把這個作爲練習留給讀者。

最後通過的IMyService落實到構造器和的IDataProvider實施進入MyService你可以使用一個dependency injection框架。

當MVC實例化一個控制器時,它將查找依賴注入框架以找出如何創建所需的依賴關係。在此示例中,當調用Index()操作時,MVC將嘗試創建MyService的實例。它將有依賴注入框架創建一個實現IMyService的實例。依賴注入框架將查找其設置並確定它需要創建一個MyService的實例,但該實現本身需要一個IDataProvider的實例。因此,依賴注入框架將再次查看其設置並確定它需要創建一個DataProvider的實例。它會將DataProvider的實例傳遞給MyService,然後將MyService的實例傳遞給MyController,然後MVC將最終調用Index()操作方法,然後操作方法將訪問該服務。

一個常見的依賴注入框架的例子是Ninject。您可以設置規則來告訴框架,對於給定的接口,這是所需的實例類型。例如:

this.Bind<IMyService>().To<MyService>(); 
this.Bind<IDataProvider>().To<DataProvider(); 

最後,(假設你使用剃刀視圖)的聲明在視圖的頂部可能看起來像:

@model IEnumerable<Instrument> 

// You are now able to use @Model. in the view to provide you the information you require. 

我希望這可以幫助,但這只是一個非常簡短的介紹你的情況。因此,我建議閱讀inversion of controldependency injectionNinject作爲潛在的依賴注入框架,儘管還有其他許多其他的。

相關問題