温莎城堡 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());
我会在我的网络应用程序 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());