代码之家  ›  专栏  ›  技术社区  ›  HaxElit

温莎WCF工厂?

  •  2
  • HaxElit  · 技术社区  · 15 年前

    所以我现在有一个主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 , 项目SQLDAO 等。

    第二个是 跟踪工具 它使用 渠道工厂 为所有dao成员创建实现。

    现在,我想开始使用windsor wcf工具而不是createchannel。最好的方法是什么?

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

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

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

    有什么想法吗?

    1 回复  |  直到 15 年前
        1
  •  0
  •   null_pointer    15 年前

    如果您使用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;
    }