我是Rest服务的新手。我对这个主题做了相当多的研究,但仍然没有清楚地理解。希望有人向我表明这一点。提前谢谢。
我的客户端将通过url在我的服务类上执行一个方法。所有我理解的是客户打电话
localhost/service/get/customers
在我的休息服务中,我有像IRepository
这样的依赖项,这样我就可以进入数据库并获取记录。如果我在客户端调用此构造函数时使用构造函数注入?
看起来我需要使用服务定位器来获取我需要它的方法中的IRepository
。
这不违反OOP原则吗?没有DI,测试是否容易?
任何人都可以澄清一下。
对于任何服务,我们如何期望客户知道什么是IRepository
它有什么方法?
是不是内部实现目的我们需要暴露给客户端吗?他为什么要为此烦恼呢?我不能只提供Uri调用哪种方法(localhost / service / Products)和完成工作。
如果您提供任何实际示例,我将不胜感激。
非常感谢。
答案 0 :(得分:2)
不,如果您要解决方法中的依赖关系,它不会违反OOP原则。但是没有必要,你可以使用Instance Provider and ServiceHostFactory在WCF中使用构造函数依赖注入,还有一个很好的例子in this question。
如果您自托管该服务,它将更加简单,因为它只需要实施IInstanceProvider
和ServiceHost
。假设你有Service
服务,构造函数采用IDependency
参数:
public class CustomInstanceProvider : IInstanceProvider, IContractBehavior
{
private readonly IDependency dependency;
public CustomInstanceProvider(IDependency dependency)
{
this.dependency = dependency;
}
public object GetInstance(InstanceContext instanceContext)
{
// Here you are injecting dependency by constructor
return new Service(dependency);
}
public object GetInstance(InstanceContext instanceContext, Message message)
{
return this.GetInstance(instanceContext);
}
public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
}
public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
}
public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
dispatchRuntime.InstanceProvider = this;
}
public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
}
public class CustomServiceHost : ServiceHost
{
public CustomServiceHost(IDependency dependency, Type serviceType, params Uri[] baseAddresses)
: base(serviceType, baseAddresses)
{
foreach (var cd in this.ImplementedContracts.Values)
{
cd.Behaviors.Add(new CustomInstanceProvider(dependency));
}
}
}
然后在创建服务时,使用CustomServiceHost
:
var serviceHost = new CustomServiceHost(dependency, typeof(Service), uris);