挂钩wcf服务创建

时间:2013-10-24 16:59:42

标签: c# wcf

我们有一个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();
    }
}

2 个答案:

答案 0 :(得分:1)

正如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)容器来解决此依赖关系。有很多可用的,但特别是,我使用Castle Windsor。

答案 1 :(得分:0)

好的,我最终做的是将单个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();
    }
}