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