我正在构建一个WCF服务。我很困惑在哪里放置组成容器的引导程序。我正在使用Ninject。 nuget包添加了一个NinjectWebCommon类,用于在Start()上组合容器。
是否应该在Business Layer中使用我的所有命令处理程序? 或者它应该与服务? 或者应该有一个单独的图层(项目)?
我在网上查了一下,但是找到任何特别的理由把它放在服务上。 哪一个是最好的方式,为什么?
请帮忙。提前谢谢。
答案 0 :(得分:1)
您可能已经知道,Bootstrap
代表整个架构的最外层。这是您在运行时使用正确的实现绑定所有接口的地方。
这是在该图层图上表示的内容:
以下是我们如何从.sln
的角度处理它的示例。
如您所见,Bootstrap
位于Presentation
图层。即使它可以位于单独的文件夹中,我们也决定将其放在那里,因为生成的Bootstrap.dll
将被复制到托管WCF服务的WebApp的/Bin
目录中。
演示文稿/引导程序:是唯一引用您的IOC的项目(我们使用的是StructureMap
,但它与nInject
完全相同)。您可以在这里找到类似的内容:
private static void ConfigureCoreServices(this ConfigurationExpression c)
{
c.For<IAccountService>().Use<AccountService>();
...
}
这就是为什么这个项目必须引用所有其他项目(因为实现可以位于任何地方)。 Bootstrap
项目也包含buildpost.bat
文件。此.bat
文件将作为OnPostBuildEvent
执行。它的工作是将Bootstrap.dll
复制到WebApp的/Bin
目录中。
Presentation
图层中的所有其他项目都非常简单。
演示文稿/合同:您的WCF服务合同和DTO的合同
演示/实施:实施WCF服务合同的类
演示文稿/制图 :(如果需要)DTO和Core
对象之间的Mapper类
演示文稿/ WCF :仅限.svc
个文件
基础设施:这是我们所有技术相关类所在的位置(基于EF的存储库实现,记录器类,对外部/第三方服务的引用,类似的东西......)
核心:所有与业务相关的内容 - &gt;域模型,接口,业务服务,......没有任何类型的项目/库
现在,回到你的根本问题,魔术在哪里?
我们创建了一个名为StructureMapServiceBehavior
的简单服务行为,如下所示:
public class StructureMapServiceBehavior : BehaviorExtensionElement, IServiceBehavior
{
public void ApplyDispatchBehavior(ServiceDescription desc, ServiceHostBase host)
{
foreach (ChannelDispatcherBase cdb in host.ChannelDispatchers)
{
var cd = cdb as ChannelDispatcher;
if (cd != null)
{
foreach (EndpointDispatcher ed in cd.Endpoints)
{
ed.DispatchRuntime.InstanceProvider =
new StructureMapInstanceProvider(desc.ServiceType);
}
}
}
Bootstrapper.ConfigureBindings();
}
...
}
Web.Config
文件如下所示:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<StructureMapServiceBehavior />
...
</behavior>
</serviceBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="StructureMapServiceBehavior" type="xxx.Presentation.Bootstrap.StructureMapServiceBehavior, xxx.Presentation.Bootstrap"/>
</behaviorExtensions>
</extensions>
...
</system.serviceModel>
您现在应该有足够的信息开始使用!