我刚刚将一个解决方案从 .NET 3.5 升级到 .NET 4 同时,我已经将所有外部库升级到最新版本,因此 CaSTLe 现在从 2.5.2 升级到 v3.0
我有一些注册数据库访问的代码,当我尝试解析时现在抛出一个异常:
[Castle.MicroKernel.ComponentResolutionException] {"Could not obtain scope for component DF.MailFlowAdapter. This is most likely either a bug in custom IScopeAccessor or you're trying to access scoped component outside of the scope (like a per-web-request component outside of web request etc)"} Castle.MicroKernel.ComponentResolutionException
组件是这样注册的:
Container
.AddFacility<WcfFacility>()
.AddFacility<DataAccessAdapterFacility>()
.Register(Component
.For<SD.LLBLGen.Pro.ORMSupportClasses.IDataAccessAdapter>()
.ImplementedBy<MailFlowAdapter>()
.LifeStyle.PerWcfOperation())
问题出在PerWcfOperation LifeStyle,但不知道为什么:项目是WCF项目,调用WCF方法时解析了组件。 此注册在使用 CaSTLe 2.5 的分支中运行良好。
验证 wcf 登录名/密码时抛出异常(在使用 UserNamePasswordValidator 的 IAuthorizationPolicy 中),因为我解析了一个 IDataAccessAdapter(以检查数据库中的登录名/密码)。
其他信息:
DataAccessAdapterFacility 是注册组件激活器的旧代码,我不得不稍微更改代码,因为 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);
}
我认为使用 Factory 可以简化带有 DataAccessAdapterFacility/DataAccessAdapterActivator 的代码,但这不是这里的问题:)
有人知道为什么我不能使用 PerWcfOperation 生活方式吗?
最佳答案
我认为在调用自定义 UserNamePasswordValidator 时 OperationContext.Current 不可用。是否可以为该组件使用另一种生活方式?
关于c# - 升级到 CaSTLe 3.0 后出现 ComponentResolutionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10579236/