2016-03-12 121 views
0

我正嘗試在C#Web API中創建一個休息服務。C#Web API中的依賴注入

目前我沒有考慮任何DB決策,因此我添加了一個模擬類庫。

我正在創建一個模型接口並在模擬類庫中實現模型。

public interface IUser 
{ 
    int userId { get; set; } 
    string firstName { get; set; } 
    string lastName { get; set; } 
    string email { get; set; } 

    List<IUser> getAllUsers(); 
    IUser getUser(int ID); 
    bool updateUser(IUser user); 
    bool deleteUser(int ID); 
} 

,並在模擬類庫

public class User : IUser 
{ 
    public string email { get; set; } 
    public string firstName { get; set; } 
    public string lastName { get; set; } 
    public int userId { get; set; } 

    public bool deleteUser(int ID) 
    { 
     throw new NotImplementedException(); 
    } 

    public List<IUser> getAllUsers() 
    { 
     throw new NotImplementedException(); 
    } 

    public IUser getUser(int ID) 
    { 
     throw new NotImplementedException(); 
    } 

    public bool updateUser(IUser user) 
    { 
     throw new NotImplementedException(); 
    } 
} 

實現這個現在模擬庫引用的服務應用程序實現的接口。

現在我需要從服務應用程序中的控制器類調用模擬實現。

如何在不創建循環依賴的情況下執行此操作。我做了一些研究,並提出了一個解決方案,即DI是要走的路。

有人可以幫我實現這與代碼示例?

非常感謝。

+0

參見http://stackoverflow.com/q/12977743/126014 –

回答

0

如果您不介意可能使用哪個IoC容器,我會推薦Ninject。

你需要通過的NuGet安裝下一個軟件包:

然後在RegisterServices的端部的Ninject配置文件NinjectWebCommon.cs()方法中添加以下代碼:

kernel.Bind<IUser>().To<User>(); 

而現在只需添加IUSER作爲參數到控制器類和Ninject將自動注入它。

public class MyController : Controller 
{ 

private IUser _user; 

    // Ninject will automatically inject a User instance here 
    // on controller creation 
    public MyController(IUser user) 
    { 
     _user = user; 
    } 
} 

有不同的方法使用Ninject,因此您可以搜索其他更適合您的需求的方法。

0

「現在我需要從服務應用程序中的控制器類調用模擬實現。」

這聽起來不對。我認爲你在這裏有一個設計問題;爲什麼你需要從你的服務應用程序中參考模擬IUser的實現?

  • 有一點要記住的是,的客戶擁有的接口,所以IUser界面不會在模擬類庫都屬於;理想情況下應該在一個完全獨立的程序集中定義,以便您的服務類庫可以引用它(並在需要時爲其提供它們自己的實現),以便您的模擬類庫

  • 這是Dependency Inversion Principle,雖然我同意某種類型的DI庫可以幫助您管理這種控制反轉的實現,但我認爲它從長遠來看不會對您有所幫助。您可能仍會遇到容器本身中的相同循環引用問題。

  • 現在我覺得你首先需要看一下使用Stairway Pattern,讓您的依賴關係正確倒你看看使用任何DI庫

0

現在模擬庫引用服務應用程序之前實現界面。

這是問題的根源。我建議將您的數據訪問層的接口移出到一個單獨的項目中。然後,您可以使用模擬/內存實現創建項目,然後使用真實實現添加另一個項目。

另一件事是您的IUser是您的DTO(數據傳輸對象)的契約,但它包含DAO(數據訪問對象)方法。通常情況下,您想要將這些問題與存儲庫模式分開。

public interface IUserRepository 
{ 
    IEnumerable<IUser> GetAllUsers(); 
    IUser GetUser(int id); 
    ... 
} 

此存儲庫是您將注入到您的API控制器。