我正在开发一个托管在其上的RESTFul Web服务的Windows服务。我将通过Windows服务与Windows服务进行通信。
这些是我的类实现。
namespace WindowsService_HostAPI
{
public partial class SelfHostService : ServiceBase
{
private int _value;
private HttpSelfHostServer _server;
private static readonly ILog _log =
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public int Value
{
get { return _value; }
set { _value = value; }
}
public SelfHostService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
var config = new HttpSelfHostConfiguration("http://localhost:8080");
config.Routes.MapHttpRoute(
name: "API",
routeTemplate: "{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
_server = new HttpSelfHostServer(config);
_server.OpenAsync().Wait();
}
protected override void OnStop()
{
if (_server != null)
_server.CloseAsync().Wait();
}
}
}
ValuesController :
namespace WindowsService_HostAPI.Controllers
{
public class ValuesController : ApiController
{
[HttpGet]
[Route("api/Value/")]
public HttpResponseMessage GetValue()
{
HttpResponseMessage response = null;
return response;
}
[HttpPost]
[Route("api/Value/{value}")]
public HttpResponseMessage SetValue(int value)
{
HttpResponseMessage response = null;
return response;
}
}
}
这只是一个例子,但我需要将ApiController与Windows服务类进行通信。
当有人通过Post(方法SelfHostService.Value
)设置SetValue
时,我必须修改value
属性。我怎么能这样做?
答案 0 :(得分:0)
我需要创建一个类实例并将其保持活动直到Windows 服务停止
使用Web API执行所需操作的正确方法是使用IDependencyResolver
。 Here's示例(它使用Unity,但您可以使用任何容器)。
主要概念是建立依赖合同,例如:
public interface IValueProvider
{
public int Value { get; set; }
}
然后在某处实现此合同(您甚至可以在SelfHostService
中实现它,但实际上,您不应该),配置DI容器以使用您的实现,并从控制器中使用它:
public class ValuesController : ApiController
{
private readonly IValueProvider _valueProvider;
public ValuesController(IValueProvider valueProvider)
{
_valueProvider = valueProvider;
}
// the rest of code here
}
请注意,通常DI容器允许构建父/子层次结构
为了反映这一点,Web API DI方法使用范围(参见IDependencyResolver.BeginScope
方法)。
有全局范围和子范围。 Web API主机在启动时创建全局范围。此范围一直存在,直到主机侦听请求。主机在收到请求时创建子范围,主机需要创建一个控制器来响应。
在管理使用容器创建的对象的生命周期时,DI容器略有不同。但常见的是将依赖关系放置在他们需要的范围内。所以,如果你想建立一些"全球"依赖,那么你需要将它放在全局范围内。