Castle.Windsor在Web.Mvc中使用
public class WindsorControllerFactory:DefaultControllerFactory
{
private readonly IKernel kernel;
public WindsorControllerFactory (IKernel kernel)
{
this .kernel = kernel;
}
public override void ReleaseController (IController controller)
{
kernel.ReleaseComponent(controller);
}
protected override IController GetControllerInstance (RequestContext requestContext, Type controllerType)
{
if (controllerType == null )
{
throw new HttpException(404 , string .Format("The controller for path '{0}' could not be found." , requestContext.HttpContext.Request.Path));
}
return (IController)kernel.Resolve(controllerType);
}
}
public class ControllerInstaller:IWindsorInstaller
{
public void Install (IWindsorContainer container,IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient());
}
}
3.构建容器,安装installers,设置mvc Controller的默认构建工厂
private static IWindsorContainer container;
protected void Application_Start ()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
container = new WindsorContainer()
.Install(FromAssembly.This());
var controllerFactory = new WindsorControllerFactory(container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
}
protected void Application_End ()
{
container.Dispose();
}
Castle.Windsor在Web.Api中使用
1.建立新的Windsor服务解析替代默认的Webapi服务解析
public class WindsorDependencyResolver:System.Web.Http.Dependencies.IDependencyResolver
{
private readonly IWindsorContainer container;
public WindsorDependencyResolver (IWindsorContainer container)
{
this .container = container;
}
public IDependencyScope BeginScope ()
{
return new DependencyScope(container.Kernel);
}
public object GetService (Type serviceType)
{
return container.Resolve(serviceType);
}
public IEnumerable<object > GetServices (Type serviceType)
{
return container.ResolveAll(serviceType).Cast<object >();
}
public void Dispose ()
{
container.Dispose();
}
}
public class DependencyScope:IDependencyScope
{
private readonly IKernel kernel;
private readonly IDisposable disposable;
public DependencyScope (IKernel kernel)
{
this .kernel = kernel;
disposable=kernel.BeginScope();
}
public object GetService (Type serviceType)
{
return kernel.Resolve(serviceType);
}
public IEnumerable<object > GetServices (Type serviceType)
{
return kernel.ResolveAll(serviceType).Cast<object >();
}
public void Dispose ()
{
disposable.Dispose();
}
}
2.创建WepApi的WindsorInstaller
public class WebApiInstaller:IWindsorInstaller
{
public void Install(Castle.Windsor .IWindsorContainer container, Castle.MicroKernel .SubSystems .Configuration .IConfigurationStore store)
{
container.Register (
Classes.FromThisAssembly ()
.BasedOn <ApiController>()
.LifestyleScoped ()
)
}
}
3.初始化Windsor容器,指定WebApi的服务解析
private static IWindsorContainer container;
protected void Application_Start ()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
container = new WindsorContainer();
container.Install(FromAssembly.This());
GlobalConfiguration.Configuration.DependencyResolver = new WindsorDependencyResolver(container);
}
protected void Application_End ()
{
container.Dispose();
}