C# 可以在Windows服务上使用Unity DI吗?

C# 可以在Windows服务上使用Unity DI吗?,c#,dependency-injection,windows-services,unity-container,C#,Dependency Injection,Windows Services,Unity Container,我正在开发一个Windows服务来执行一些定期操作,我可以使用Unity从另一个库中注入我的类吗 我想在我的服务上使用[Dependency]属性,在windows服务启动的入口点注册组件 例如: static class Program { static void Main() { ServiceBase[] ServicesToRun; UnityConfig.RegisterComponents(); ServicesT

我正在开发一个Windows服务来执行一些定期操作,我可以使用Unity从另一个库中注入我的类吗

我想在我的服务上使用[Dependency]属性,在windows服务启动的入口点注册组件

例如:

static class Program
{
    static void Main()
    {
         ServiceBase[] ServicesToRun;
         UnityConfig.RegisterComponents();
         ServicesToRun = new ServiceBase[] 
         { 
                new EventChecker()
         };
         ServiceBase.Run(ServicesToRun);
   }
}


public static class UnityConfig
{
    public static void RegisterComponents()
    {
        UnityContainer container = new UnityContainer();
        container.RegisterType<IEventBL, EventBL>();
    }
}

public partial class EventChecker : ServiceBase
{
    private Logger LOG = LogManager.GetCurrentClassLogger();

    [Dependency]
    public Lazy<IEventBL> EventBL { get; set; }

    protected override void OnStart(string[] args)
    {
        var events = EventBL.Value.PendingExecution(1);
    }
}

如果您知道任何其他解决方案,请分享:)

像Unity这样的DI容器也可以用来组成Windows服务的对象图。注意,一般来说,您应该更喜欢使用构造函数注入。这可以防止和防止您的代码依赖于DI库本身(具有讽刺意味的是需要依赖于DI库,因为它试图帮助您防止组件之间的强耦合)

此外,您应该简单地让容器解析您的服务。换句话说,不要手动更新服务,而是从容器请求新实例:

ServicesToRun = new ServiceBase[] 
{ 
    container.Resolve<EventChecker>()
};

谢谢,这更好。这会自动解决EventCheckerService中的其他注入以及注入的类中的其他注入。@mithun:一个DI库不允许您通过将服务注入其他服务来自动为您建立相关对象的图形,这是完全没有用的。如果是那样的话,你最好和我在一起。大多数DI库都可以为您构建完整的图形。
ServicesToRun = new ServiceBase[] 
{ 
    container.Resolve<EventChecker>()
};
public class EventChecker : ServiceBase
{
    private static IUnityContainer container;

    public EventChecker(IUnityContainer container) {
        this.container = container;
    }

    public void SomeOperationThatGetsTriggeredByATimer() {
        using (this.container.StartSomeScope()) {
            var service = this.container.Resolve<IEventCheckerService>();

            service.Process();
        }
    }
}