我正在使用 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绑定。
我的问题是:
如果我使用netTcpBinding,我不能将LifestylePerWebRequest用于DbContext,对吗?
将LifestylePerWcfOperation用于DbContext是安全和正确的吗?如果是,可以和BasicHttpBinding一起使用吗?我没有找到详细解释PerWcfOperation的信息。
我的架构好吗?也许我误解了IoC / DI的一些重要概念?
谢谢!
答案 0 :(得分:1)
正确。在WCF中,LifestylePerWebRequest仅适用于启用了AspNetCompatibility的HTTP绑定。
LifestylePerWcfOperation可用于任何WCF绑定。
架构看起来相当复杂,但它是否正常取决于应用程序的规模和复杂程度。如果没有更多的信息,真的不可能理智地回答这个问题。这种架构非常分离,我的第一个问题是它是否针对手头的问题进行了过度设计,以及您是否也面临贫血领域模型的风险。