2010-10-21 67 views
2

所以我现在有一个主DAO类ITrackingToolDAO,它拥有我的每个业务实体的所有服务合同。温莎WCF工厂?

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接口2个具体实现。 第一个是TrackingToolSqlDAO它为每个实体实例化一个具体的SQL DAO。即)BusinessFunctionSqlDAOProjectSqlDAO

第二个是一个TrackingToolWCFDao这产生使用的ChannelFactory <Ť>创建用于我的所有成员DAO的实施WCF proxys。

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

我想创建一个ITrackingToolDAO的虚拟实现,它在构造函数中使用了IKernel参数。

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

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

有什么想法?

回答

0

如果您使用Castle.Facilities.WcfIntegration,你可以设置你道是这样的:

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