c# - 升级到 CaSTLe 3.0 后出现 ComponentResolutionException

标签 c# wcf castle-windsor castle

我刚刚将一个解决方案从 .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/

相关文章:

caSTLe-windsor - 远程通用组件的异常 "an item with the same key has already been added"

c# - WCF Windows 服务。可以本地连接,但不能远程连接

wcf - 在客户端,WCF操作合约的返回值为null!有什么解决办法吗?

inversion-of-control - 在 Unity 中检测循环依赖的原因

使用 PerWebRequest 生活方式测试 CaSTLe windsor 组件

c# - JavaScript : pass an array to WCF service (c#)

c# - 2018 年如何保护我的 .NET Core 2.1 代码免遭逆向工程

c# - LINQ to Entities 无法识别方法 'System.DateTime GetValueOrDefault()'

c# - 如何在 WCF 中使用自定义绑定(bind)并使用用户名客户端凭据保持消息安全模式?

c# - 如何使用RedirectToAction重定向到页面中的某个位置?