ソリューションで DI (つまり、Castle Windsor) を使用しようとしていますが、次の例外が発生します。
No component for supporting the service Company.Web.Controllers.DashboardController was found
この例外はWindsorControllerFactory.GetControllerInstance()
、コントローラーを解決しようとしたときに発生します (つまり: (IController)_kernel.Resolve(controllerType);
)
ただし、 DI インストーラーとコントローラー ファクトリを asp.net アプリケーションに移動し、その Web プロジェクトがソリューション内のすべてのプロジェクトを参照するようにすると、例外は発生しません。
質問: 例外以上を解決し、依存関係の挿入とその構成を独自のアセンブリ (つまり、Company.Initialization) に含めるにはどうすればよいですか?
コードを改善するための建設的な批判を自由に提供してください。
現在のソリューション プロジェクトのセットアップ
- Company.Initialization は、Company.Initialization というアセンブリにあります。これには、DI 構成と Castle Windosr への参照が含まれるアセンブリが含まれます。
- Company.Initialization には、すべてのアセンブリへの参照があります。
- Company.Web は、Company.Web というアセンブリにあります。
- Company.Web は ASP.NET MVC4 アプリケーションです。
ControllersInstaller.cs
namespace Company.Initialization
{
public class ControllersInstaller : IWindsorInstaller
{
/// <summary>
/// Installs the controllers
/// </summary>
/// <param name="container"></param>
/// <param name="store"></param>
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(FindControllers().LifestyleTransient());
}
/// <summary>
/// Find controllers within this assembly in the same namespace as HomeController
/// </summary>
/// <returns></returns>
private BasedOnDescriptor FindControllers()
{
return AllTypes.FromAssemblyNamed("Company.Web")
.BasedOn<IController>()
.If(Component.IsInNamespace(@"Company.Web.Controllers"))
.If(t => t.Name.EndsWith("Controller"));
}
}
}
RepoInstaller.cs
namespace Company.Initialization
{
public class RepoInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromAssemblyNamed("Company.Services")
.Where(type => type.Name.EndsWith("Service"))
.WithService.DefaultInterfaces().LifestyleSingleton());
container.Register(AllTypes.FromAssemblyNamed("Company.NHibernateProvider")
.Where(type => type.Name.EndsWith("Repository"))
.WithService.DefaultInterfaces().LifestyleSingleton());
}
}
}
WindsorControllerFactory.cs
namespace Company.Initialization
{
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel;
/// <summary>
/// Constructor
/// </summary>
/// <param name="kernel"></param>
public WindsorControllerFactory(IKernel kernel)
{
_kernel = kernel;
}
/// <summary>
/// Release the controller at the end of it's life cycle
/// </summary>
/// <param name="controller">The Interface to an MVC controller</param>
public override void ReleaseController(IController controller)
{
_kernel.ReleaseComponent(controller);
}
/// <summary>
/// Resolve a controller dependency
/// </summary>
/// <param name="requestContext">The HTTP context</param>
/// <param name="controllerType">Type of controller to resolve</param>
/// <returns>IController</returns>
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);
}
}
}