0

在我的 WCF 项目中,我在 global.asax 中使用 Castle Windsor 注册了我的界面:

            Component.For<IStrategy>()
                .ImplementedBy<MyStrategy>()
                .LifestylePerWcfOperation(),

然后稍后在同一个文件中,我使用 FluentNhibernate 使用提供程序配置 NHibernate:

FluentConfiguration configuration = Fluently.Configure()
            .Database(
                MsSqlConfiguration.MsSql2008.ConnectionString(myConnString)
                .Provider<ConnectionProvider>())
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<TenantMap>()) etc etc

但是,此 ConnectionProvider 托管在一个公共共享 dll 库中,因为还有其他 WCF 服务需要使用它。我想按如下方式注册此依赖项,但它不起作用,这意味着我必须手动新建一个实例。

    public ConnectionProvider()
    {    
        // doesnt work
        using (IDependencyScope scope = GlobalConfiguration.Configuration.DependencyResolver.BeginScope())
        {
            _myStrategy = scope.GetService<IStrategy>();
        }
    }

有没有办法使这项工作?它就像它现在在另一个组件中一样失去了范围。在同一个程序集中,DependencyScope 工作正常并创建了一个实例,但我想将它保存在一个共享的 dll 中。

编辑:我得到的错误是“System.Web.Http.Dependencies.EmptyResolver”在这段代码的手表上:GlobalConfiguration.Configuration.DependencyResolver

4

1 回答 1

0

我可以看到上面的代码有几个问题:

1) 您正在使用每个 WcfOperation 生活方式注册 IStrategy,MyStrategy。这意味着 windsor 将为每个 WcfOperation 创建一个策略。另一方面,您正在尝试使用 scope.GetService 手动设置组件的生活方式。要使 scope.GetService 发挥作用,您需要一种生活方式。

2)假设上面ConnectionProvider的代码是构造函数,看来构造函数是在试图从容器中获取一些东西。这通常是个坏主意,在使用像 windsor 这样的 Ioc 容器时更糟。而是将 IStrategy 传递给构造函数(注入它)。

3) 看到你这里调用容器是构造函数,可能说明你没有遵循容器只有3次调用,1次注册组件,1次获取顶层组件,1次调用的原则释放容器。

我建议您阅读更多关于依赖注入和 Ioc 容器的信息,以全面了解如何使用此容器。

于 2015-02-27T10:18:25.040 回答