2010-10-21 70 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; 
}