温莎WCF设施工厂?

发布于 2024-09-28 20:06:55 字数 1541 浏览 0 评论 0原文

因此,我目前有一个主 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 接口的 2 个具体实现。 第一个是 TrackingToolSqlDAO,它为每个实体实例化一个具体的 SQL DAO。即) BusinessFunctionSqlDAO、ProjectSqlDAO 等。

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

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

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

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

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

有什么想法吗?

So I currently have a master DAO class ITrackingToolDAO that has all the Service Contracts for each of my business entities.

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

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

My Service Contract looks like so

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

I currently have 2 concrete implementations of my ITrackingToolDAO interface.
The first one is TrackingToolSqlDAO which instantiates a concrete SQL DAO for each entity. i.e) BusinessFunctionSqlDAO, ProjectSqlDAO, etc.

The second one is a TrackingToolWCFDao which creates WCF proxys using ChannelFactory<T> to create an implementation for all my DAO members.

Now, I want to start using the Windsor WCF facility instead of CreateChannel. What would be the best way to accomplish this ?

I was thinking of creating a dummy implementation of ITrackingToolDAO that took in an IKernel parameter in the constructor.

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

This way i could use the WCF Facility to create all my channels. I just don't like it cuz it's using the container as a service locator which is a code smell. Ideally I would also like it if I could have my SQL DAO and new WCF DAo both registered in the container so I could create either one by just referencing them by name.

Any thoughts ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

〆一缕阳光ご 2024-10-05 20:06:55

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

If you're using Castle.Facilities.WcfIntegration, you could setup your dao like this:

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

You can than use WcfIntegration facility like this:

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

Than for BusinessFunctionDAO you can do constructor injection like this:

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


   private readonly IProject _project;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文