温莎WCF设施工厂?

时间:2010-10-21 21:20:47

标签: c# wcf castle-windsor ioc-container

所以我目前有一个DAO类ITrackingToolDAO,它拥有我的每个业务实体的所有服务合同。

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

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

我的服务合同如此

[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);
}

我目前有两个具体的ITrackingToolDAO接口实现。 第一个是 TrackingToolSqlDAO ,它为每个实体实例化一个具体的SQL DAO。即) BusinessFunctionSqlDAO ProjectSqlDAO 等。

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

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

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

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果你正在使用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,您可以像这样进行构造函数注入:

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


   private readonly IProject _project;
}