Code Pyre

All Code Dies and Burns in Time

Fork me on GitHub

Windows Services With Ninject and TopShelf

| Comments

I was testing out TopShelf and here is an example I put together in order to have Ninject activate the services and their dependencies:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#region Using Directives

using System;
using System.ServiceProcess;
using YourCorp.Services;
using Ninject;
using Topshelf;
using Topshelf.Configuration;
using Topshelf.Configuration.Dsl;

#endregion

namespace YourCorp
{
    internal static class Program
    {
        private static void Main( string[] args )
        {
            using ( IKernel kernel = CreateKernel() )
            {
                RunConfiguration cfg =
                    RunnerConfigurator.New(
                        x =>
                        {
                            x.SetDisplayName( "Your Service" );
                            x.SetServiceName( "YourService" );
                            x.SetDescription( "Your Service" );
                            x.ConfigureService<MonitoringService>( kernel );
                            x.ConfigureService<ReportingService>( kernel );
                            x.RunAsLocalSystem();
                        } );

                Runner.Host( cfg, args );
            }
        }

        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            kernel.Bind<IWindowsService>().To<MonitoringService>();
            kernel.Bind<IWindowsService>().To<ReportingService>();
            return kernel;
        }
    }

    public static class SyntaxExtensions
    {
        public static void ConfigureService<T>( this IRunnerConfigurator runnerConfigurator, IKernel kernel )
            where T : ServiceBase, IWindowsService
        {
            runnerConfigurator.ConfigureService<T>(
                c =>
                {
                    c.HowToBuildService( serviceName => kernel.Get<T>() );
                    c.Named( typeof (T).Name );
                    c.WhenStopped( s => s.Stop() );
                    c.WhenStarted( s => s.Start() );
                } );
        }
    }

    public interface IWindowsService
    {
        void Start();
        void Stop();
    }
}

« Build Systems Using Ninject with TopShelf and Quartz »

Comments