4

私は Windows サービスを持っています。このサービスで Web API を公開して、ユーザーが http 経由でサービスと対話できるようにしたいと考えています。

セルフホスト Web API ( http://www.asp.net/web-api/overview/hosting-aspnet-web-api/self-host-a-web-api )の実行方法を理解しています。これが私の主な問題です。私のApiControllerを実行元のクラスとインターフェースする方法です。これにより、httpリクエストが処理されたときにイベントがトリガーされ、ApiControllerの外部で何かが発生します。

次の例に基づいて、イベント ハンドラー UserRegistered をサービス クラスに登録するにはどうすればよいですか?

Web API コントローラー

public class MyController : ApiController
    {
        public delegate void OnPostRegister(Profile user);

        public event OnPostRegister UserRegistered;

        public void PostStream(Profile user)
        {
            try
            {
                IProfileBuilder builder = new ProfileBuilder();
                builder.RegisterProfile(user);

                if (UserRegistered!= null)
                {
                    UserRegistered(user);
                }

            }
            catch (Exception ex)
            {
                throw new HttpException(500, ex.Message);
            }
        }

サービス クラス

public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        //initialize web api
        var config = new HttpSelfHostConfiguration("http://localhost:8080");

        config.Routes.MapHttpRoute(
            "API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });

        using (var server = new HttpSelfHostServer(config))
        {
            server.OpenAsync().Wait();
        }

        //Load registered profiles
    }

    protected override void OnStop()
    {
    }
}
4

2 に答える 2

2

コントローラーのインスタンスにアクセスして、イベントを直接サブスクライブできるとは思いません。おそらく、疎結合のイベント ハンドラーが必要だと思います。EventAggregator を提案するつもりでしたが、これは Prism の一部であり、抽出することはできますが、WPF 向けです。あなたの問題を解決できるように見えるこれを見つけました。

http://blogs.taiga.nl/martijn/2011/07/28/loosely-coupled-events-in-net-and-harvesting-open-source-projects/

于 2013-10-29T14:04:20.960 に答える