Nuget引用
添加 Castle.Windsor
MVC项目
添加WindsorControlFactory.cs类,重构控制器生成
namespace castle.IOC
{
public class WindsorControlFactory:DefaultControllerFactory
{
private readonly IKernel _kernel;
public WindsorControlFactory(IKernel kernel)
{
_kernel = kernel;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
throw new HttpException(404, string.Format("未找到对应的路径'{0}'", requestContext.HttpContext.Request.Path));
return (IController)_kernel.Resolve(controllerType);
//return base.GetControllerInstance(requestContext, controllerType);
}
public override void ReleaseController(IController controller)
{
_kernel.ReleaseComponent(controller);
base.ReleaseController(controller);
}
}
}
注册组件
namespace castle.IOC
{
public class WindsorControlInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
//throw new NotImplementedException();
container.Register(
Classes.FromThisAssembly() //寻找接口或类的地方
.BasedOn<IController>() //实现IController接口
//.If(Component.IsInSameNamespaceAs<HomeController>())
//.If(c=>c.Name.EndsWith("Controller"))
.Configure(_=>_.LifestyleTransient())
);
container.Register(
Component.For<IPersonService>().ImplementedBy<PersonService>().LifestyleTransient()
);
}
}
}
修改Gloabal.asax.cs
namespace castle
{
public class MvcApplication : System.Web.HttpApplication
{
private IWindsorContainer _container;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//初始化容器
_container = new WindsorContainer().Install(FromAssembly.This());
ControllerBuilder.Current.SetControllerFactory(new WindsorControlFactory(_container.Kernel));
}
protected void Application_End()
{
_container.Dispose();
}
}
}
API项目
新建WindsorActivator.cs类,继承IHttpControllerActivator,主要实现Controller的Create方法
namespace CastleAPI.IOC
{
public class WindsorActivator : IHttpControllerActivator
{
private readonly IWindsorContainer _container;
public WindsorActivator(IWindsorContainer container)
{
_container = container;
}
private class Release : IDisposable
{
private readonly Action _release;
public Release(Action release)
{
_release = release;
}
public void Dispose()
{
_release();
}
}
public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
var controller = (IHttpController)_container.Resolve(controllerType);
request.RegisterForDispose(new Release(() => _container.Release(controller)));
//throw new NotImplementedException();
return controller;
}
}
}
添加注册类:WindsorInstaller 继承IWindsorInstaller
namespace CastleAPI.IOC
{
public class WindsorInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Classes.FromThisAssembly()
.BasedOn<ApiController>()
.LifestyleTransient()
);
container.Register(
Component.For<IPersonService>().ImplementedBy<PersonService>().LifestyleTransient()
);
}
}
}
全局Gobal.asax.cs文件注册
namespace CastleAPI
{
public class WebApiApplication : System.Web.HttpApplication
{
//全局容器
private static IWindsorContainer _container;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//
WindsorConfig();
}
public static void WindsorConfig()
{
_container = new WindsorContainer();
_container.Install(FromAssembly.This());
_container.Kernel.Resolver.AddSubResolver(
new CollectionResolver(_container.Kernel, true));
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new WindsorActivator(_container));
}
}
}
调试的时候注意控制器是继承了 Controller还是ApiController!