jjzjj

简单喷油器 - 延迟初始化

程序员大本营 2024-04-23 原文

有人可以协助我解决一个问题吗?

我有两个服务。

高斯:

public class GAuth : IGAuth{    public async Task<UserCredential> AuthorizeAsync(ClientSecrets clientSecrets)    {        using (var cts = new CancellationTokenSource())        {            var localServerCodeReceiver = new LocalServerCodeReceiver();            cts.CancelAfter(TimeSpan.FromMinutes(1));            return await GoogleWebAuthorizationBroker.AuthorizeAsync(                clientSecrets,                _scopes,                User,                cts.Token,                new FileDataStore(string.Empty), localServerCodeReceiver            );        }    }}

gdrive:

public class GDrive : IGDrive{    private readonly DriveService _driveService;    public GDrive(UserCredential userCredential)    {        _driveService = new DriveService(new BaseClientService.Initializer        {            HttpClientInitializer = userCredential,            ApplicationName = string.Empty        });    }}

和注册部分:

container.Register<IGAuth, GAuth>(Lifestyle.Singleton);container.Register<IGDrive, GDrive>(Lifestyle.Singleton);

如你看到的 GAuth 服务返回 UserCredentials 授权后的对象。和这个 UserCredentials 是必需的 GDrive 服务。这是简化的示例,但总的来说,我需要初始化 GDrive 正确的服务 UserCredentials 用户后对象按 Auth 申请表上的按钮。

有什么方法可以做到吗?

提前致谢。

看答案

从设计的角度来看,注射构造器应该是 简单,快速和可靠。在您的情况下,情况并非如此,因为对象图的构建取决于I/O。

相反,您应该将IO推迟到构造函数运行后。

我想到有两件事可以做。您要么注入 IGAuth 进入gdrive,并确保在构造函数运行后将其调用,或者您注入懒惰的异步 UserCredential 可以在构造函数运行后请求。

这是后者的一个例子:

public class GDrive : IGDrive{    private readonly Lazy<Task<DriveService>> _driveService;    public GDrive(Lazy<Task<UserCredential>> userCredential)    {        _driveService = new Lazy<Task<DriveService>>(async () =>            new DriveService(new BaseClientService.Initializer            {                HttpClientInitializer = await userCredential.Value,                ApplicationName = string.Empty            }));    }    public async Task SomeMethod()    {        var service = await _driveService.Value;        service.DoSomeStuff();    }}

您可以配置此 GDrive 如下:

var auth = new GAuth();var credentials = new Lazy<Task<UserCredential>>(    () => auth.AuthorizeAsync(new ClientSecrets()));container.RegisterSingleton<IGDrive>(new GDrive(credentials));

另一个选项是注入 GAuth 进入 GDrive。这将导致以下内容:

public class GDrive : IGDrive{    private readonly Lazy<Task<DriveService>> _driveService;    public GDrive(IGAuth auth)    {        _driveService = new Lazy<Task<DriveService>>(async () =>            new DriveService(new BaseClientService.Initializer            {                HttpClientInitializer = await auth.AuthorizeAsync(new ClientSecrets()),                ApplicationName = string.Empty            }));    }    public async Task SomeMethod()    {        var service = await _driveService.Value;        service.DoSomeStuff();    }}

请注意,在这两种情况下 Lazy<Async<T>> 创建将确保仅在 Lazy<T>.Value 第一次被称为。

有关简单喷油器 - 延迟初始化的更多相关文章

  1. ruby-on-rails - 未初始化的常量 Psych::Syck (NameError) - 2

    在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到ruby​​gems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决

  2. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  3. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  4. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  5. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  6. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  7. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  8. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  9. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  10. Qt Designer的简单使用 - 2

    在前面两节的例子中,主界面窗口的尺寸和标签控件显示的矩形区域等,都是用C++代码编写的。窗口和控件的尺寸都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和大小了。用C++代码编写图形界面的问题就是不直观,因此Qt项目开发了专门的可视化图形界面编辑器——QtDesigner(Qt设计师)。通过QtDesigner就可以很方便地创建图形界面文件*.ui,然后将ui文件应用到源代码里面,做到“所见即所得”,大大方便了图形界面的设计。本节就演示一下QtDesigner的简单使用,学习拖拽控件和设置控件属性,并将ui文件应用到Qt程序代码里。使用QtDesigner设计界面在开始菜单中找到「Q

随机推荐