DomainModel은 모두다 구성이 마쳐진 상태로 가정하고 MVC에 구성하는 방법에 대해서 알아본다.
먼저, web.config에 configSections에 castle속성과 IRepository에 대한 속성을 등록하고, httpModules에 Lifestyle에 대한 module을 등록한다.
다음, WindsorControllerFactory를 생성한다. WindsorControllerFactory는 DefaultControllerFactory를 상속하며, ControllerInstance를 저장하고 반환하는데 사용된다.
마지막으로 Controller의 생성자를 이용해서 사용될 DomainModel의 interface를 등록하는 것으로 완료할 수 있다.
상당히 간단한데 왜 외워지지가 않는 것일까.; Castle에 대해서는 두번째 포스트인데 포스트 내용이 비스무리하다. -_-
먼저, web.config에 configSections에 castle속성과 IRepository에 대한 속성을 등록하고, httpModules에 Lifestyle에 대한 module을 등록한다.
01.
<
configsections
>
02.
<
section
name
=
"castle"
type
=
"Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"
>
03.
</
section
>
04.
<
castle
>
05.
<
components
>
06.
<
component
id
=
"productRepository"
service
=
"DomainModel.Abstract.IProductRepository, DomainModel"
type
=
"DomainModel.Concrete.SqlProductRepository, DomainModel"
lifestyle
=
"PerWebRequest"
>
07.
<
parameters
>
08.
<
connectionstring
>Data Source=HOME-PC\SQLEXPRESS;Initial Catalog=SportsStore;Integrated Security=True;Pooling=False</
connectionstring
>
09.
</
parameters
>
10.
</
component
>
11.
</
components
>
12.
</
castle
>
13.
14.
<
httpmodules
>
15.
<
add
name
=
"PerRequestLifestyle"
type
=
"Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.MicroKernel"
>
16.
</
add
>
17.
</
httpmodules
></
configsections
>
다음, WindsorControllerFactory를 생성한다. WindsorControllerFactory는 DefaultControllerFactory를 상속하며, ControllerInstance를 저장하고 반환하는데 사용된다.
01.
public
class
WindsorControllerFactory : DefaultControllerFactory
02.
{
03.
private
WindsorContainer container;
04.
05.
public
WindsorControllerFactory()
06.
{
07.
container =
new
WindsorContainer(
new
XmlInterpreter(
new
ConfigResource(
"castle"
)));
08.
var controllerTypes = from t
in
Assembly.GetExecutingAssembly().GetTypes()
09.
where
typeof
(IController).IsAssignableFrom(t) select t;
10.
foreach
(Type t
in
controllerTypes)
11.
{
12.
container.AddComponentWithLifestyle(t.FullName, t, LifestyleType.Transient);
13.
}
14.
}
15.
16.
protected
override
IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
17.
{
18.
return
(IController)container.Resolve(controllerType);
19.
}
20.
}
01.
public
class
ProductController : Controller
02.
{
03.
private
IProductRepository _productRepository;
04.
public
ProductController(IProductRepository productRepository)
05.
{
06.
_productRepository = productRepository;
07.
}
08.
09.
10.
public
ViewResult List()
11.
{
12.
return
View(_productRepository.Products.ToList());
13.
}
14.
}
상당히 간단한데 왜 외워지지가 않는 것일까.; Castle에 대해서는 두번째 포스트인데 포스트 내용이 비스무리하다. -_-