我刚刚升级了一个解决方案,从.NET 3.5升级到.NET 4,同时,我将所有外部库升级到最新版本,因此城堡现在从2.5.2升级到v3.0。
我有一些注册数据库访问的代码,当我试图解决时,这些代码现在会抛出异常:
Castle.MicroKernel.ComponentResolutionException {“无法为组件DF.MailFlowAdapter获取作用域。这很可能是自定义IScopeAccessor中的错误,或者您试图访问作用域以外的范围组件(例如web请求以外的每个web请求组件等等)”} Castle.MicroKernel.ComponentResolutionException。
该组件以如下方式注册:
Container
.AddFacility<WcfFacility>()
.AddFacility<DataAccessAdapterFacility>()
.Register(Component
.For<SD.LLBLGen.Pro.ORMSupportClasses.IDataAccessAdapter>()
.ImplementedBy<MailFlowAdapter>()
.LifeStyle.PerWcfOperation())问题来自于PerWcfOperation LifeStyle,但我不知道为什么:该项目是一个WCF项目,组件在调用WCF方法时得到解决。此注册在使用Castle2.5的分支中运行良好。
验证wcf登录/pwd时(在使用IAuthorizationPolicy的UserNamePasswordValidator中)会引发异常,因为我解析了IDataAccessAdapter (检查db中的IDataAccessAdapter/pwd)。
其他资料:
DataAccessAdapterFacility是注册组件激活器的旧代码,我不得不稍微修改de代码,因为model.Service更改为model.Services:
void Kernel_ComponentModelCreated(ComponentModel model)
{
foreach (var service in model.Services)
{
if (service == typeof(SD.LLBLGen.Pro.ORMSupportClasses.IDataAccessAdapter))
{
model.CustomComponentActivator = typeof(DataAccessAdapterActivator);
}
}
}DataAccessAdapterActivator负责使用配置文件中的连接字符串创建对象:
protected override object InternalCreate(CreationContext context)
{
var connectionString = string.Empty;
if (ConfigurationManager.ConnectionStrings["Main"] != null)
connectionString = ConfigurationManager.ConnectionStrings["Main"].ConnectionString;
return new MailFlowAdapter(connectionString);
}我认为使用DataAccessAdapterFacility/DataAccessAdapterActivator的代码可以简化使用工厂,但这里的问题不是:)
那么,有人知道为什么我不能使用PerWcfOperation生活方式吗?
发布于 2012-05-19 07:22:53
好吧,让我们继续我和Craig在城堡邮件列表上的讨论:
我不会在这里发布我的代码,因为一旦您阅读了混合生活方式是如何在蓖麻黄b项目中完成的,这是非常简单的
发布于 2012-05-17 15:05:32
我认为在调用自定义OperationContext.Current的时候,UserNamePasswordValidator是不可用的。有可能用另一种生活方式来做这个组件吗?
https://stackoverflow.com/questions/10579236
复制相似问题