我有用C#編寫的Web API應用程序。我正在努力確保設計符合SOLID原則。因此,我使用Unity將依賴關係注入到我的控制器中。但是我想讓控制器執行的動作脫離控制器本身,所以他們基本上只是調用其他(通常是靜態的)對象的方法。例如:依賴注入/ SOLID憂慮
public class MyController : ApiController
{
private readonly ISomeCrossCuttingInterface _instance;
private readonly ILog _log;
public MyController(ISomeCrossCuttingInterface someInterface, ILog log)
{
_instance = someInterface;
_log = log;
}
[HttpPost]
[ActionName("MyAction")]
public RequestResponse MyAction(MyActionData actionData)
{
try
{
return MyActionUser(actionData);
}
catch (Exception ex)
{
_log.Error("MyAction error", ex);
}
return ...;
}
private RequestResponse MyActionUser(MyActionData actionData)
{
var responseObj = StaticClass.SomeMethod(_instance, actionData);
var responseObj2 = StaticClass2.SomeMethod(_instance, responseObj2);
return CreateMyActionResponse(responseObj2);
}
private RequestResponse CreateMyActionResponse(...)
{
...
}
}
什麼我遇到一些焦慮過度是是否使用的對象執行工作(如StaticClass和StaticClass2以上)實際上應該被注入。目前他們不是。已經注入的對象是那些涉及橫切問題的對象,例如日誌記錄或數據訪問,或者被多個控制器使用。那麼爲什麼我不注入執行工作的對象呢?我認爲這些「內部」對象只用於執行與一個控制器相關的特定工作。也就是說,控制器的功能基本上已經被分解成一個負責任的對象,每個控制器擁有自己獨特的一組對象,可以完成控制器需要做的任何事情。然而,這是一個糟糕的設計?是否應該注入所有對象?任何輸入真的讚賞。
謝謝,這聽起來像一個更好的方法,我目前的代碼沒有聞到正確的(!)。該服務需要在我的Unity配置中進行設置,如下所示:container.RegisterType()。這將讓統一知道爲這種依賴創建什麼類型。我需要找到的是我如何將LoginService的依賴關係傳遞給它。 –
fhevol
您可以通過使用'container.RegisterTypes',而不是使它更容易爲自己,這將掃描實現你的接口類的一組組件。您可以使用一個約定,這樣如果有一個'LoginService'實現的'ILoginService'那麼這就是它會自動通過注射來解決的類型。 http://msdn.microsoft.com/en-us/library/dn178463(v=pandp.30).aspx – demoncodemonkey