Castle Windsor を初めてセットアップしようとしていますが、いくつか問題があります。私のソリューションには 3 つのプロジェクトがあります。
- ドメイン
- ダル
- ウェブ
サービスは DAL にあります。それらはすべて から継承しIService
ます。(UserService
実装IUserService
、IUserService
実装IService
)。Web アプリケーションは MVC 5 アプリケーションです。すべてのコントローラは から継承しBaseController
ます。
この投稿を使用して Windsor をセットアップしましたが、例外が発生し続けます。
タイプ 'Castle.MicroKernel.ComponentNotFoundException' の例外が Castle.Windsor.dll で発生しましたが、ユーザー コードで処理されませんでした
追加情報: サービス Solution.Web.Controllers.HomeController をサポートするためのコンポーネントが見つかりませんでした
奇妙なことは、コントローラーのパスが正しいことです。
以下は、構成用の私のコードです。
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 ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Classes.FromThisAssembly()
.BasedOn(typeof(BaseController))
.LifestyleTransient());
}
}
public class ServiceInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Types.FromAssemblyContaining(typeof(IService).GetType())
.BasedOn<IService>().WithService.FromInterface()
.LifestyleTransient()
);
}
}
そして、Global.asax で:
public class MvcApplication : System.Web.HttpApplication
{
private static IWindsorContainer container;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
// Setup Castle.Windsor IOC
MvcApplication.BootstrapContainer();
}
protected void Application_End()
{
container.Dispose();
}
private static void BootstrapContainer()
{
container = new WindsorContainer().Install(FromAssembly.This());
container.Install(FromAssembly.Containing(typeof(IService).GetType()));
var controllerFactory = new WindsorControllerFactory(container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
}
}
正しい方向へのヘルプやガイダンスは大歓迎です!