将ServiceBase类实例传递给托管在其上的ApiController

时间:2015-09-03 11:33:53

标签: c# asp.net-web-api windows-services

我正在开发一个托管在其上的RESTFul Web服务的Windows服务。我将通过Windows服务与Windows服务进行通信。

这是我的项目结构:

enter image description here

这些是我的类实现。

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属性。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

  

我需要创建一个类实例并将其保持活动直到Windows   服务停止

使用Web API执行所需操作的正确方法是使用IDependencyResolverHere'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容器略有不同。但常见的是将依赖关系放置在他们需要的范围内。所以,如果你想建立一些"全球"依赖,那么你需要将它放在全局范围内。