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();
}