1

ソリューションで 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) に含めるにはどうすればよいですか?

コードを改善するための建設的な批判を自由に提供してください。

現在のソリューション プロジェクトのセットアップ

  1. Company.Initialization は、Company.Initialization というアセンブリにあります。これには、DI 構成と Castle Windosr への参照が含まれるアセンブリが含まれます。
  2. Company.Initialization には、すべてのアセンブリへの参照があります。
  3. Company.Web は、Company.Web というアセンブリにあります。
  4. 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);
        }

    }
}
4

0 に答える 0