引导程序(容器编写器)应该存在于哪一层?

时间:2013-12-10 08:42:56

标签: c# asp.net wcf

我正在构建一个WCF服务。我很困惑在哪里放置组成容器的引导程序。我正在使用Ninject。 nuget包添加了一个NinjectWebCommon类,用于在Start()上组合容器。

是否应该在Business Layer中使用我的所有命令处理程序? 或者它应该与服务? 或者应该有一个单独的图层(项目)?

我在网上查了一下,但是找到任何特别的理由把它放在服务上。 哪一个是最好的方式,为什么?

请帮忙。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您可能已经知道,Bootstrap代表整个架构的最外层。这是您在运行时使用正确的实现绑定所有接口的地方。

这是在该图层图上表示的内容:

enter image description here

以下是我们如何从.sln的角度处理它的示例。

enter image description here

如您所见,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>

您现在应该有足够的信息开始使用!