【问题标题】:Castle Windsor web.config parameters温莎城堡 web.config 参数
【发布时间】:2017-04-07 09:54:46
【问题描述】:

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

// (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>

【问题讨论】:

标签: c# web-config castle-windsor


【解决方案1】:

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

我的新代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多