首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >升级到Castle3.0后的ComponentResolutionException

升级到Castle3.0后的ComponentResolutionException
EN

Stack Overflow用户
提问于 2012-05-14 07:39:30
回答 2查看 992关注 0票数 2

我刚刚升级了一个解决方案,从.NET 3.5升级到.NET 4,同时,我将所有外部库升级到最新版本,因此城堡现在从2.5.2升级到v3.0。

我有一些注册数据库访问的代码,当我试图解决时,这些代码现在会抛出异常:

Castle.MicroKernel.ComponentResolutionException {“无法为组件DF.MailFlowAdapter获取作用域。这很可能是自定义IScopeAccessor中的错误,或者您试图访问作用域以外的范围组件(例如web请求以外的每个web请求组件等等)”} Castle.MicroKernel.ComponentResolutionException。

该组件以如下方式注册:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
void Kernel_ComponentModelCreated(ComponentModel model)
{
    foreach (var service in model.Services)
    {
        if (service == typeof(SD.LLBLGen.Pro.ORMSupportClasses.IDataAccessAdapter))
        {
            model.CustomComponentActivator = typeof(DataAccessAdapterActivator);
        }
    }
}

DataAccessAdapterActivator负责使用配置文件中的连接字符串创建对象:

代码语言:javascript
运行
复制
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生活方式吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-19 07:22:53

好吧,让我们继续我和Craig在城堡邮件列表上的讨论:

  • 这种行为已经发生了变化,在2.5版中,它正在回归一种短暂的生活方式。但是,由于它是不一致的(没有关于组件何时是PerWcfOperation以及何时是瞬态的信息),所以已经删除了。
  • 可以使用自定义的生活方式范围访问器进行同样的操作。

我不会在这里发布我的代码,因为一旦您阅读了混合生活方式是如何在蓖麻黄b项目中完成的,这是非常简单的

票数 0
EN

Stack Overflow用户

发布于 2012-05-17 15:05:32

我认为在调用自定义OperationContext.Current的时候,UserNamePasswordValidator是不可用的。有可能用另一种生活方式来做这个组件吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10579236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档