如何使用DI(Castle Windsor WCFFacility)向NetTcpBinding WCF注册EF DbContext?

时间:2014-01-14 17:35:36

标签: wcf entity-framework dependency-injection ef-code-first castle-windsor

我正在使用 EF6 CodeFirst WCF 4.5 NetTcpBinding BasicHttpBinding 。此外,我正在使用 Castle.Windsor 进行DI。

我有以下架构:

MySolution.Core (类库)
- 域
- (...域类......)
- 数据
- IRepository.cs

MySolution.BusinessLogic (类库)
- (...业务逻辑类......)

MySolution.Data (使用EF6的类库)
- 型号
- 制图
- MyContext.cs(MyContext:DbContext,IDbContext)
- EFRepository.cs(EFRepository:IRepository,在构造函数中注入IDbContext) - IDbContext.cs

MySolution.Services (使用http和net.tcp在IIS中托管的WCF项目)
- AppCode
- Initialization.cs(而不是global.asax,与netTcpBinding一起使用)
- 安装人员
- BusinessLogicInstaller.cs
- RepositoriesInstaller.cs
- ServicesInstaller.cs

在AppCode / Initialization.cs中我有:

container = new WindsorContainer();
container.AddFacility<WcfFacility>();
container.Install(
new ServicesInstaller(),
new BusinessLogicInstaller(),
new RepositoriesInstaller());

并且,在Installers / RepositoriesInstaller.cs中:

public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            // registration for EF context
            container.Register(Classes.FromAssemblyNamed("MySolution.Data")
                .InNamespace("MySolution.Data.Models")
                .WithService.AllInterfaces()
                .LifestylePerWcfOperation());

            // registration for EF repository classes
            container.Register(Classes.FromAssemblyNamed("MySolution.Data")
                .InNamespace("MySolution.Data")
                .WithService.AllInterfaces()
                .LifestyleTransient());
        }

ServicesInstaller和BusinessLogicInstaller使用LifestyleTransient注册类。

Obs:WCF将来必须提供RESTful绑定。

我的问题是:

  1. 如果我使用netTcpBinding,我不能将LifestylePerWebRequest用于DbContext,对吗?

  2. 将LifestylePerWcfOperation用于DbContext是安全和正确的吗?如果是,可以和BasicHttpBinding一起使用吗?我没有找到详细解释PerWcfOperation的信息。

  3. 我的架构好吗?也许我误解了IoC / DI的一些重要概念?

  4. 谢谢!

1 个答案:

答案 0 :(得分:1)

  1. 正确。在WCF中,LifestylePerWebRequest仅适用于启用了AspNetCompatibility的HTTP绑定。

  2. LifestylePerWcfOperation可用于任何WCF绑定。

  3. 架构看起来相当复杂,但它是否正常取决于应用程序的规模和复杂程度。如果没有更多的信息,真的不可能理智地回答这个问题。这种架构非常分离,我的第一个问题是它是否针对手头的问题进行了过度设计,以及您是否也面临贫血领域模型的风险。