2013-07-15 1 views
9

.Net Web Forms 프로젝트 구조를 개발 중이며 Unity를 응용 프로그램의 DI 프레임 워크로 사용하기로 결정했습니다. 유니티가 아닙니다 [Depedency] Annotation은 의존성 자체입니까?

MSDN-Resolving in Asp.Net

내 프로젝트에 종속성을 주입하기 위해 나는 DI 컨테이너의 외부 을 생성 초기 개체 를 구축 할 필요가 있다고 주장한다. 그것이 우리가 질문에 이르렀다 고합니다. 이러한 [Dependency] 같은

  1. 속성 주석은 Attribute 클래스 확장 클래스이다. 클래스를 사용하려면 다른 네임 스페이스가 선언 클래스에 포함되어야합니다. 따라서 클래스는 Microsoft.Practices.Unity.DependencyAttribute 클래스에 종속됩니다. 이제는 클래스가 사용하는 IMyInterface 구현을 인식하지 못할 수도 있지만 종속 클래스의 구체적인 구현을 알고 있어야합니다. 내가 여기서 누락 된 것은 무엇인가? DI 프레임 워크를 변경하려면 프로젝트 전체에서 모든 주석을 제거해야합니다.

  2. 컨테이너 외부에서 이러한 종류의 선언 (구성 파일 또는 무언가)을 피할 수있는 방법이 있습니까?

편집 -> 코드 여기

/*This is the abstract base class where I want the dependency injection to occur*/ 
public abstract class BasePage : System.Web.UI.Page 
{ 
    private IMyService _dtService; 
    public IMyService DtService 
    { 
     get { return _dtService; } 
     set { _dtService = value; } 
    } 
} 

public class Global : System.Web.HttpApplication 
{ 
    void Application_Start(object sender, EventArgs e) 
    { 
     IUnityContainer myContainer = HttpContext.Current.Application.GetDIContainer(); 
     myContainer.RegisterType<IMyService,MyServiceClient>(new 
        InjectionConstructor("MyServiceWsEndpoint")); 
     // I have tried this with BasePage too 
     myContainer.RegisterType<_Default>(new InjectionProperty("DtService")); 

    } 
} 

그리고 모듈

뒤에

public partial class _Default : BasePage 
{ 

    public _Default() 
    { 

    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      DataClass dt = DtService.GetDataById(2); 
      lblWhatever.Text = dt.Description; 
     } 
    } 
} 

글로벌 코드 뒤에 Default.aspx를 코드

public class UnityHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.PreRequestHandlerExecute += OnPreRequestHandlerExecute; 
    } 

    public void Dispose() { } 

    private void OnPreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     IHttpHandler currentHandler = HttpContext.Current.Handler; 
     /*This does not work*/ 
HttpApplicationStateExtensions.GetDIContainer(HttpContext.Current.Application).BuildUp(
          currentHandler.GetType(), currentHandler); 
     /* While this works*/ 
HttpApplicationStateExtensions.GetDIContainer(HttpContext.Current.Application).BuildUp<_Default>((_Default)currentHandler); 

     var currentPage = HttpContext.Current.Handler as Page; 
     if (currentPage != null) 
     { 
      currentPage.InitComplete += OnPageInitComplete; 
     } 
    } 
} 

모듈 내의 코드는 매번 도달합니다. 그 라인은 [Dependency] 속성을 사용할 때 INDEED가 작동합니까?

+2

대부분의 IOC 컨테이너는 당신을 제약의이 종류를 놓지 마십시오. 문제가 발생하면 대체 컨테이너를 고려해보십시오. structmap, autofac, simpleinjector 등이 있습니다. – MattDavey

+1

유니티 프레임 워크의 제한 사항은 아니지만 asp의 제약입니다.닷넷 WebForms, 어디에 개체의 건설을 제어 할 수없는, 그래서 속성 주입을해야합니다. 그 다른 DI 프레임 워크는 주입을 필요로하는 클래스를 변경하지 않고 속성 주입을 할 수 있습니까? –

+2

맞아 - [이 질문] (http://stackoverflow.com/questions/4979453/structuremap-beginner-property-injection)에 대한 첫 번째 대답은 정확히 그 시나리오 (Structuremap 사용)를 설명합니다. 대부분의 DI 라이브러리에는이 동작이 포함되어 있다고 가정합니다. – MattDavey

답변

5

예, 종속성 속성을 가진 코드는 구현을 컨테이너에 단단히 연결합니다.

은 주입하는 어떤 특성을 결정하는 몇 가지 방법이 있습니다 :

  • 속성
  • XML 구성
  • 프로그래밍 구성
  • 사용자 컨테이너 확장 해결하기 위해

한 가지 방법 속성의 사용은 모든 페이지를 등록하고 프로그래밍 방식으로 어떤 속성을 지정하는지 BuildUp에 필요한 주입 및 공급 무시하기 :

IUnityContainer container = new UnityContainer(); 

// Assume we have a logger we are injecting 
container.RegisterType<ILogger, Logger>(new ContainerControlledLifetimeManager()); 

// Register the Dependency Properties for the Page 'MyPage'. 
// Property names on MyPage are "Logger" 
container.RegisterType<MyPage>(new InjectionProperty("Logger")); 

// ...later 

IHttpHandler currentHandler = HttpContext.Current.Handler; 

// Perform Property Injection. 
// Logger will be injected from the existing container registration. 
container.BuildUp(currentHandler.GetType(), currentHandler); 
+0

단 하나의 질문. BuildUp (Tobject)을 사용하면 배선이 성공적으로 완료됩니다. 나는 BuildUp (typeof (MyPage), myPage)를 사용해야하므로 내 HTTP 모듈에서는이 코드를 사용할 수 없다. 두 번째는 배선 작업을 수행하지 못합니다. –

+1

@ ThanosK. BuildUp (myPage.GetType(), myPage);을 사용하십시오. – onof

+0

같은 것. 배선이 필요 없습니다. –

관련 문제