C#으로 작성된 웹 API 응용 프로그램이 있습니다. 나는 솔리드 (SOLID) 원칙을 고수하는 디자인을 보장하려고 노력 중이다. 이와 같이 Unity를 사용하여 내 컨트롤러에 의존성을 주입합니다. 그러나 나는 컨트롤러 자체에서 컨트롤러에 의해 수행되는 액션을 얻길 원하기 때문에 기본적으로 다른 (종종 정적 인) 객체의 메소드를 호출한다. 예를 들어 :종속성 삽입/솔리드 걱정
나는 객체가 작업을 수행하는 데 사용 여부를 통해 약간의 불안을 경험하고 무엇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)가 실제로 주입해야한다. 현재 그들은 그렇지 않습니다. 주입 된 개체는 로깅이나 데이터 액세스와 같은 교차 절단 문제와 관련되거나 둘 이상의 컨트롤러에서 사용되는 개체입니다. 그렇다면 작업을 수행하는 객체를 주입하지 않는 이유는 무엇입니까? 나는이 '내부'객체가 하나의 컨트롤러와 관련된 특정 작업을 수행하는 데에만 사용된다고 생각합니다. 즉, 컨트롤러 기능은 본질적으로 하나의 책임을 지닌 객체로 나뉘어져 있습니다. 각 컨트롤러에는 컨트롤러가 수행해야하는 작업을 수행하는 고유 한 객체 세트가 있습니다. 그러나 이것은 나쁜 설계입니까? 모든 사물을 관계없이 주입해야합니까? 모든 입력 정말 감사합니다.
감사합니다. 이것은 더 나은 접근 방법처럼 들리지만, 현재 코드는 올바르게 냄새를 맡지 않습니다 (!). 이 서비스는 다음과 같이 유니티 구성에서 설정해야합니다 : container.RegisterType(). 이것은 통일성이이 종속성을 위해 만들 유형을 알 수있게합니다. 내가 알아야 할 것은 LoginService의 의존성을 어떻게 전달하는지입니다. –
fhevol
대신 인터페이스를 구현하는 클래스에 대한 어셈블리 집합을 검사하는'container.RegisterTypes'를 사용하면 더 쉽게 만들 수 있습니다. 규칙을 사용하면 'ILoginService'를 구현하는 LoginService가 있으면 주입을 통해 자동으로 해결되는 유형을 사용할 수 있습니다. http://msdn.microsoft.com/en-us/library/dn178463(v=pandp.30).aspx – demoncodemonkey