C# ASP.NET MVC 4에서 CommonServiceLocator.WindsorAdapter 사용하여 IoC 세팅


이전 포스트에서 Windsor를 이용해서 IoC를 세팅하는 방법을 소개하였다.

(2013/01/25 - [ASP.NET MVC] - [IoC & DI]ASP.NET MVC 4에서 Windsor (Castle)로 IoC로 Controller 생성)

이전 방법은 Windsor IoC에 대해서 Dependency하게 세팅하는 방법으로 다른 종류의 IoC를 세팅하기 위해서는 다른 접근 전략을 세워야만 했었다.

그렇지만 CommonServiceLocator을 사용하면 아래와 같은 IoC에 상관없이 일관되게 프로젝트에서 접근하고 사용할 수 있다.

- NInject

- Windsor

- MEF

- Unity

- StructureMap

- … ( ETC )

 

우선 CommonServiceLocator의 Open Source를 알려 주도록 하겠다.

http://commonservicelocator.codeplex.com/ : CommonServiceLocator URL

다음으로 이번에 같이 소개할 WindsorAdapter ( CommonServiceLocator을 사용할 수 있도록 도와주는 Extended Adapter )

https://github.com/yellowfeather/CommonServiceLocator.WindsorAdapter

 

이번 포스트에서는 WindosrAdapter을 사용하여 ASP.NET MVC 4에서 Controller 생성하도록 하겠다.

이제 Visual Studio에서 해당 DLL을 추가하면 된다.

Tip!
다른 IoC를 CommonServiceLocator Adapter해서 구현해 놓은 라이브러리가 있다.

Castle Windsor Adapter

Spring .NET Adapter

Unity Adapter

StructureMap Adapter

Autofac Adapter

MEF Adapter now on .NET Framework 4.0

LinFu Adapter

Multi-target CSL binaries

 

Visual studio에서 Nuget을 통해 CommonServiceLocator.WindsorAdapter을 프로젝트에 추가한다.

추가하였으면

다음 클래스를 작성하기 바란다.

파일명 : CommonServiceLocatorControllerFactory.cs

/// <summary>
/// CommonServiceLocator을 이용해서 DefaultControllerFactory를 구현한다.
/// </summary>
public class CommonServiceLocatorControllerFactory : DefaultControllerFactory
{
    /// <summary>
    /// 인스턴스된 Controller를 가져온다.
    /// </summary>
    /// <param name="requestContext">Request Context</param>
    /// <param name="controllerType">Typeof Controller</param>
    /// <returns>Controller object</returns>
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        //controllerType이 있으면
        if (controllerType == null)
            return base.GetControllerInstance(requestContext, controllerType);

        //ServiceLocator에  파라메터를 넘겨서 IController를 가져오도록 한다.
        return ServiceLocator.Current.GetInstance(controllerType) as IController;
    }
}

 

이제 Global에서 수정하면 IoC가 세팅이 될 것이다.

파일명 : Global.asax

public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();

 

//Windosr Container을 세팅한다.
//FromAssembly.This()를 실행하면  ControllersInstaller ( IWindsorInstaller 구현 클래스 )에 정의된 범위에서 Instance시킨다.
container = new WindsorContainer().Install(FromAssembly.This());

//ServiceLocator에 Provider을 등록한다.
ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(container));
//ASP.NET MVC Framework에 ControllerFactory를 세팅한다.
ControllerBuilder.Current.SetControllerFactory(typeof(CommonServiceLocatorControllerFactory));

        }
    }

 

위와 같이 수정하고 실행해 보도록 하자.

정상적으로 페이지가 나오는 것을 확인할 수 있을 것이다.

 

그렇지만 의문이 들 것이다.

내가 세팅한 ServiceLocator가 작동이 된 것인지 아니면 기본적인 설정으로 된 것인지 알 수 없기 때문이리라.

그리하여 직접 Debug 모드에서 확인해 보도록 하겠다.

아래와 같이 CommonServiceLocatorControllerFactory.cs파일에서 return되기 직전에 breakpoint를 걸어 보도록 하겠다.

이제 F5를 눌러 실행시켜 보자.

페이지가 호출 될 때마다 해당 Controller 찾는 시도를 한다는 것을 알 수 있을 것이다.

그래서 이제는 정상적으로 동작하고 있다는 것을 확실 할 수 있을 것이다.

 

Tip!

CommonServiceLocator을 사용하기 위해서는 Windsor이 온전하게 동작을 한 상태에서 ServiceLocator을 연결해야 한다.

예로 Windsor IoC에서 Register을 이용해 어떤 DLL(범위 확정)에서 어떤 타입의 객체를 인스턴스 시켜줘야 하는지에 대한 작업이 필요 하다

이 작업은 IWindsorInstaller을 상속하여 구현한 클래스에 정의 되어 있다.

 

2013/01/25 - [ASP.NET MVC] - [IoC & DI]ASP.NET MVC 4에서 Windsor (Castle)로 IoC로 Controller 생성


+ Recent posts