首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >浅谈如何使用简单喷射器实现Azure工作者角色

浅谈如何使用简单喷射器实现Azure工作者角色
EN

Stack Overflow用户
提问于 2017-06-08 16:46:59
回答 1查看 323关注 0票数 0

我引用了几个文档,但我需要正确的实现才能正确地完成它。

参考资料

  1. 统一到工人角色:https://alexandrebrisebois.wordpress.com/2013/04/14/building-windows-azure-services-without-compromising-testability/
  2. 控制台应用程序SimpleInjector:http://simpleinjector.readthedocs.io/en/latest/consoleintegration.html

我的问题

  1. 引用-1,Unity使用using (var uc = new UnityContainer()){...},但SimpleInjector有ThreadScopedLifestyleAsyncScopedLifestyle。我用哪一个?
  2. Reference-2有static Main类、static readonly Containerstatic contructor。我是否为员工角色定义了static Container?那么用于依赖项注册的static constructor呢?
  3. 我的实现如下我的实现部分。这段代码实现正确吗?

参考码

参考文献1;

代码语言:javascript
复制
static class Program
{
    static readonly Container container;

    static Program()
    {
        container = new Container();

        container.Register<IUserRepository, SqlUserRepository>();
        container.Register<MyRootType>();

        container.Verify();
    }

    static void Main()
    {
        var service = container.GetInstance<MyRootType>();
        service.DoSomething();
    }
}

参考文献2;

代码语言:javascript
复制
public class WorkerRole : RoleEntryPoint
{
 public override void Run()
 {
     // This is a sample worker implementation. Replace with your logic.
     Trace.WriteLine("Worker entry point called", "Information");

     using (var uc = new UnityContainer())
     {
         uc.RegisterType<ILogger, TableStorageLogger>();
         uc.RegisterType<IEnumerable<IMessageHandler>, IMessageHandler[]>();

         var processor = uc.Resolve<MessageProcessor>();

         while (true)
         {
             processor.Process();
             Thread.Sleep(10000);
             Trace.WriteLine("Working", "Information");
         }
     }
 }

我的实现

我认为(1) Container足以成为static,(2) OnStart是注册服务的好地方,(3)每个循环都会创建和处理预期的服务实例。

代码语言:javascript
复制
public class WorkerRole : RoleEntryPoint
{
    static readonly Container container = new Container();

    public override void Run()
    {
        while (true)
        {
            using (ThreadScopedLifestyle.BeginScope(container))
            {
                var service = container.GetInstance<SomeService>();
                service.DoSomething();
            }
        }
    }

    public override bool OnStart(){
        // define.
        container.Register<SomeService>();
        container.Register<ProcessRecorderSetting>();
        container.Verify();
    } 
}

注意:我不知道上面的代码是否有效。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-08 20:59:27

引用-1,联合使用使用(var uc =新的UnityContainer()){.},但是SimpleInjector有ThreadScopedLifestyle或AsyncScopedLifestyle。我用哪一个?

如果我没有弄错的话,Azure工作者角色是一个短暂的应用程序,它会被启动来做一件简单的事情,而不是很快就死掉,就像控制台应用程序一样。

考虑到DI,这使得工作角色的开发与控制台应用程序的开发非常相似。这意味着:

  • 这个应用程序寿命很短。
  • 只运行一个请求(与与web服务/应用程序并行运行多个请求相比)
  • 有一组限制的依赖项需要注册。

这意味着,由于应用程序是单线程和短暂的,所以不需要使用作用域的生活方式(如ThreadScopedLifestyleAsyncScopedLifestyle)。相反,您可以轻松地将所有依赖项注册为单例,解析根,调用其方法,并释放容器。

但是,如果您的应用程序存在很长时间,并且在一个没完没了的循环中继续,您通常希望模拟一个‘请求’的概念。这通常意味着每个循环都是一个请求,在此请求期间,您可以从容器解析。请注意,您只需要一个范围的生活方式,如果你真的有范围注册。如果没有,则不必将请求包装在作用域中。如果您已经注册了作用域,则必须将每个请求包装在一个作用域中,就像在您的示例中所做的那样。

Reference-2有静态主类、静态只读容器和静态结构体.是否为员工角色定义静态容器?依赖项注册的静态构造函数呢?

虽然静态构造函数免费提供线程安全和单例行为,但是在抛出异常时,它们会使调试复杂化,因为真正的错误被包装在TypeInitializationException中。但是,您的cctor确实可以轻松地初始化静态Container字段。在静态字段中使用Container是很好的。

但是,由于这些类型的应用程序非常小,只有一小部分依赖项,所以完全不使用DI容器。相反,请使用纯DI。这听起来可能是来自开发和维护DI容器的人的一个奇怪的建议,但我发现将Pure用于小型应用程序更实用,尤其是当您的寄存器都是单例时。其优点是:

  • 您对对象图的构造有编译时支持。
  • 它防止了不得不使用第三方工具。
  • 当涉及到应用程序的初始化阶段时,DI容器有很多开销,而工作者角色应该快速启动。
  • 对于小对象图来说可能要容易得多。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44441419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档