0

我正在开发一个 WCF 服务,它有一个名为 MyApp.IOperationService 的合同。

<service name="MyApp.OperationService">
    <endpoint address="OperationService" binding="basicHttpBinding" contract="MyApp.IOperationService" />
</service>

对于服务行为,我使用了 InstanceContextMode = InstanceContextMode.Single 和 ConcurrencyMode = ConcurrencyMode.Multiple,因为应用程序使用共享的物理资源。

我需要这个服务的管理界面,首先我在同一个服务中添加了一个新合同。这种方法对我没有吸引力,因为管理合同通过元数据暴露给使用操作合同的客户。

然后我选择完全创建另一个服务。

<service name="MyApp.AdminService">
    <endpoint address="Admin" binding="netTcpBinding" contract="MyApp.IAdminService" />
</service>

该服务有一个称为 Login 的操作,它将 pincode 传播到 OperationService 对象。

namespace MyApp
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, UseSynchronizationContext = false)]
    public class AdminService : IAdmin
    {
        MyApp.OperationService objOperationService = null;

        public AdminService(MyApp.OperationService objOperationService)
        {
            m_objOperationService = objOperationService;
        }

        public void Login(string pincode)
        {
            m_objOperationService.Login(pincode);
        }
    }       
}

在自托管环境中,我创建了一个 MyApp.OperationService 对象,然后将该对象传递给 MyApp.AdminService 的构造函数。对于 IIS 托管,我发现我需要使用 WCF 扩展点并实现 IInstanceProvider,然后使用 ServiceHostFactory。

在这一点上,我停下来想知道这是否会起作用,因为我的 AdminService 需要一个已经创建的由 IIS 控制的 MyApp.OperationService,而且对于我谦虚的目的来说,它看起来已经非常复杂了。

问题是是否可以通过另一种方式实现这一点(未通过元数据公开的现有服务的管理合同/接口)?

谢谢你。

4

1 回答 1

0

除了使用 WCF 扩展点之外,我找不到解决问题的方法。我使用 Microsoft.Practices.Unity 通过 IoC 管理服务,然后使用 .svc 文件中的 Factory 属性。

于 2013-07-15T08:32:14.460 回答