c# - 温莎 WCF 设施工厂?

标签 c# wcf castle-windsor ioc-container

所以我目前有一个主 DAO 类 ITrackingToolDAO,它包含我的每个业务实体的所有服务契约(Contract)。

public partial interface ITrackingToolDAO {
    void Open(string connectionString);
    void Close();

    IBusinessFunctionDAO BusinessFunction { get; }
    IBusinessUnitDAO BusinessUnit { get; }
    IProgramBudgetDAO ProgramBudget { get; }
    IProjectDAO Project { get; }
    ...
}

我的服务契约(Contract)看起来是这样的

[ServiceContract(Namespace="http://bmgops.qintra.com/Tracking/v1/BusinessFunction")]
public partial interface IBusinessFunctionDAO {

    [OperationContract]
    BusinessFunction GetBusinessFunction(Int32 businessFunctionId);

    [OperationContract]
    IEnumerable<BusinessFunction> Find(string filter);

    [OperationContract]
    SaveEventArgs<BusinessFunction>Save(BusinessFunction businessFunction);
}

我目前有 2 个 ITrackingToolDAO 接口(interface)的具体实现。 第一个是 TrackingToolSqlDAO,它为每个实体实例化一个具体的 SQL DAO。即)BusinessFunctionSqlDAOProjectSqlDAO

第二个是 TrackingToolWCFDao,它使用 ChannelFactory 创建 WCF 代理,为我的所有 DAO 成员创建实现。

现在,我想开始使用 Windsor WCF 工具而不是 CreateChannel。实现此目标的最佳方法是什么?

我正在考虑创建一个 ITrackingToolDAO 的虚拟实现,它在构造函数中接受一个 IKernel 参数。

public class DummyDAO: ITrackingToolDAO {
    public DummyDAO(IKernel kernel) {
        _ProjectDAO = kernel.Resolve<IProject>();
        ....
    }
}

这样我就可以使用 WCF 工具来创建我的所有 channel 。我只是不喜欢它,因为它使用容器作为服务定位器,这是一种代码味道。理想情况下,如果我可以让我的 SQL DAO 和新的 WCF DAo 都在容器中注册,那么我也可以通过按名称引用它们来创建任何一个。

有什么想法吗?

最佳答案

如果您正在使用 CaSTLe.Facilities.WcfIntegration,您可以像这样设置您的 dao:

container.Register(Component.For<IProject>().ImplementedBy<Project>());

您可以像这样使用 WcfIntegration 工具:

container.AddFacility<WcfFacility>()
    .Register(Castle.MicroKernel.Registration.Component.For<IBusinessFunctionDAO>()
    .ImplementedBy<BusinessFunctionDAO>()
    .AsWcfService());

对于 BusinessFunctionDAO,您可以像这样进行构造函数注入(inject):

public class BusinessFunctionDAO : IBusinessFunctionDAO 
{
   public BusinessFunctionDAO(IProject project)
   {
      if (project== null) new ArgumentException("project");
      _project = project;
   }
...


   private readonly IProject _project;
}

关于c# - 温莎 WCF 设施工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3992051/

相关文章:

c# - 可以序列化,但不能反序列化?

c# - 网络服务包装器

asp.net-mvc - 带参数的 MvcContrib Windsor 设置组件

dependency-injection - 在实现 IDependencyResolver 和 IDependencyScope 的类中应如何编码 Dispose?

c# - 温莎城堡 : Conditional registration of open generic types

c# - ASP.NET MVC 3 Razor : Passing Data from View to Controller

c# - Activator.CreateInstance 与工厂模式

c# - 表内表的CSS

wcf - IIS 7.5 Wcf https WSDL 总是返回空白(错误请求)

asp.net - WCF 服务的内部终结点不适用于 Azure Web 角色