挂钩 wcf 服务创建

本文关键字:创建 服务 wcf 挂钩 | 更新日期: 2023-09-27 18:36:49

我们有一个WCF服务,有多个客户端连接到它。

我们的服务已设置为每实例服务。服务需要有权访问另一个实例对象才能完成其工作。所需实例不是 wcf 服务,我宁愿不使所需实例成为单一实例。

如果服务是我创建的对象,那么我只需将它需要与之交互的实例对象传递给它。 但由于这是一个 wcf 服务,它是由 wcf 创建的。

如何挂钩服务的创建以向其传递

一些要使用的数据/接口,或者如何在创建服务后获取指向服务的指针,以便我可以向其传递所需的实例。

[ServiceContract]    
public interface IMyService
{
    [OperationContract(IsOneWay = true)]
    void DoSomethingCool();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
class MyService : IMyService 
{
    private IHelper helper;
    void DoSomethingCool()
    {
        // How do I pass an instance of helper to MyService so I can use it here???
        helper.HelperMethod();
    }
}

挂钩 wcf 服务创建

正如 Tim S. 所建议的那样,您应该阅读依赖注入(从他的评论中,链接可以在这里找到 http://msdn.microsoft.com/en-us/library/vstudio/hh273093%28v=vs.100%29.aspx)。poor mans dependency injection可以像这样使用:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
class MyService : IMyService 
{
    private IHelper _helper;
    public MyService() : this(new Helper())
    {
    }
    public MyService(IHelper helper)
    {
       _helper = helper;
    }
    void DoSomethingCool()
    {            
        helper.HelperMethod();
    }
}

如果你想要一个特定的实现,你需要得到一个 IoC ( Inversion of Control ) 容器,以解决此依赖关系。有很多可用的,但特别是,我使用温莎城堡。

好的,我最终做的是创建一个单例 ServiceGlue 对象作为中介,而不是让我的帮助程序类成为单例。

服务和帮助程序都向作为单一实例的中介自行注册,并且单一实例来回传递实例。

在设置服务之前,我将实例化单一实例并注册帮助程序,以便每个服务都可以获取帮助程序对象。

这使我的代码看起来像:

public class ServiceGlue
{
    private static ServiceGlue instance = null;
    public static ServiceGlue Instance
    {
        get
        {
            if (instance == null)
                instance = new ServiceGlue();
             return instance;
         }
     }
    public Helper helper { get; set; }
}

[ServiceContract]    
public interface IMyService
{
    [OperationContract(IsOneWay = true)]
    void DoSomethingCool();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode =     ConcurrencyMode.Multiple)]
class MyService : IMyService 
{
    private IHelper helper;
    public MyService()
    {
       // use an intermidiary singleton to join the objects
       helper = ServiceGlue.Instance.Helper();
    }
    void DoSomethingCool()
    {
       // How do I pass an instance of helper to MyService so I can use it here???
       helper.HelperMethod();
    }
}