【问题标题】:Spring.Net inject into instantiated windows service? Is it possible?Spring.Net 注入实例化的 Windows 服务?可能吗?
【发布时间】:2016-08-30 05:55:58
【问题描述】:

我有一个使用顶层架子的 Windows 服务,并且在我拥有的服务的主要方法中,

static void Main(string[] args)
        {
            //TopShelf
            if (args != null && args.Length > 0)
            {
                var host = HostFactory.New(
                        x =>
                        {
                            x.Service<MyWindowsSvcHost>(
                                s =>
                                {
                                    s.ConstructUsing(name => new MyWindowsSvcHost());
                                    s.WhenStarted(tc => tc.Start(null));
                                    s.WhenStopped(tc => tc.Stop());
                                });
                            x.RunAsLocalSystem();
                            x.SetDescription("SomeServiceName");
                            x.SetDisplayName("SomeServiceName");
                            x.SetServiceName("SomeServiceName");

                        });
                host.Run();

                Environment.ExitCode = 0;
            }
            else
            {
                ServiceBase[] ServicesToRun = new ServiceBase[] { new MyWindowsSvcHost() };
                ServiceBase.Run(ServicesToRun);
            }
        }

我正在使用 spring 注入该服务的静态属性。在 MyWindowsSvcHost 中,我有一个静态属性 myStaticProperty,我想将其加载到其中。以下是我的服务 app.config 的样子

<object id="SomeName" singleton="false" type="MyWindowsSvcHostAssembly.MyWindowsSvcHost, MyWindowsSvcHostAssembly">
        <property name="MyStaticProperty" ref="myStaticObject" />
      </object>

      <object id="myStaticObject" singleton="true" type="SomeAssembly.MyStaticClass, SomeAssembly">
      </object>

在服务内部,我拥有属性

public static SomeClass MyStaticProperty { get;放; }

但这始终为空。如果我将下面的单例更改为 true 并对其进行调试,它总是被正确分配并且一切正常。

<object id="SomeName" singleton="true" type="MyWindowsSvcHostAssembly.MyWindowsSvcHost, MyWindowsSvcHostAssembly">
            <property name="MyStaticProperty" ref="myStaticObject" />
          </object>

知道这里的幕后发生了什么吗?

【问题讨论】:

    标签: c# .net code-injection spring.net


    【解决方案1】:

    结果证明这个解决方案很简单。当我启动服务时,

    ServiceBase[] ServicesToRun = new ServiceBase[] { new MyWindowsSvcHost() };
    

    我不得不将它解析为弹簧加载的实例,而不是创建一个新实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      相关资源
      最近更新 更多