1

我刚刚开始使用 Windsor 来解决依赖问题。但是我在控制器中传递字符串值时遇到了错误。我检查了几个类似的温莎邮报,但没有运气。

public class HomeController : Controller
{
    public readonly String _A = string.Empty;
    public HomeController(string A)
    {
        this._A = A;        
    }
}

安装程序

public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Classes.FromThisAssembly()
            .BasedOn<IController>()
            .LifestyleTransient());
    } 

温莎控制器工厂

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

我是否需要将“A”包装在一个类中并解析它各自的接口?

4

2 回答 2

2

是的,这将是更可取的解决方案,因为它使依赖关系非常清晰。

public class HomeControllerConfig
{
    public string A { get; set; }
}

public class HomeController : Controller
{
    public readonly String _A = string.Empty;
    public HomeController(HomeControllerConfig config)
    {
        this._A = config.A;        
    }
}

安装程序

public void Install(IWindsorContainer container, IConfigurationStore store)
{
    ...
    container.Register(Component.For<HomeControllerConfig>().Instance(new HomeControllerConfig { A = "..." }));
} 
于 2016-05-19T03:45:33.350 回答
0

这取决于A你的应用程序的语义,但简而言之,不 - 你不必包装它。文档详细解释了如何配置它。

于 2016-08-21T03:40:11.663 回答