挂钩 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();
}
}
正如 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();
}
}