温莎城堡 web.config 参数

Castle Windsor web.config parameters

我会在我的网络应用程序 web.config 中传输 Windor 安装程序,但我需要传递一个参数,该参数是 class 的静态属性。有一个例子:

// (namespace Web)

public void Install(IWindsorContainer container, IConfigurationStore store)
{
    container.Register(
        Component.For(typeof(IRepository))
            .ImplementedBy(typeof(Repository<MyCtx>))
            .DependsOn(Dependency.OnValue("store", MvcApplication.GlobalStore))
            .LifestylePerWebRequest()
    );
}

我的实际web.config:

<components>
  <component
      service="Core.Business.IRepository, Core"
      type="EF.Business.Repository, EF"
      lifestyle="PerWebRequest">
    <parameters>
      <store>Web.MvcAppltication.GlobalStore ???</store>
    </parameters>
  </component>
</components>

我得出结论,必须在代码中定义一些内容。因此我决定了创建设施的方式。

我的新密码:

Web.config

 <component
      service="Core.Business.IRepository, Core"
      type="EF.Business.Repository`1[[EF.CreationContext, EF]], EF"
      lifestyle="PerWebRequest">
  </component>

DependencyResolver.cs

public class RuntimeDataSupportFacility : AbstractFacility
{
    protected override void Init()
    {
        Kernel.Resolver.AddSubResolver(new RuntimeDataDependencyResolver());
    }
}

public class RuntimeDataDependencyResolver : ISubDependencyResolver
{
    private Type[] acceptedTypes = new[] { typeof(IDictionary<String, Object>) };

    public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
    {
        if (ReferenceEquals(dependency.TargetType, acceptedTypes[0])) // typeof(IDictionary<String, Object>
            return MvcApplication.GlobalStore;

        return null;
    }

    public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
    {
        if (acceptedTypes.Any(t => ReferenceEquals(t, dependency.TargetType)))
            return true;

        return false;
    }
}

Global.asax.Application_Start():

Container =
    new WindsorContainer()
    .AddFacility<RuntimeDataSupportFacility>() // New code
    .Install(Configuration.FromAppConfig());