首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当我转向依赖注入时,使用语句会发生什么情况?

当我转向依赖注入时,使用语句会发生什么情况?
EN

Stack Overflow用户
提问于 2012-09-10 22:23:24
回答 3查看 3.7K关注 0票数 25

我目前使用的代码如下:

代码语言:javascript
运行
AI代码解释
复制
public class MyProvider
{
    public MyProvider()
    {
    }

    public void Fetch()
    {
        using (PopClient popClient = new PopClient())
        {
            ....
        }
    }
}

因为我希望能够对Fetch方法进行单元测试,并且不能模拟PopClient,所以我创建了一个调用PopClient的接口和包装类。我更新的代码看起来像这样:

代码语言:javascript
运行
AI代码解释
复制
public class MyProvider
{
    private readonly IPopClient popClient;

    public MyProvider(IPopClient popClient)
    {
        this.popClient = popClient;
    }

    public void Fetch()
    {
        using (var pop3 = popClient)
        {
            ....
        }
    }
}

我正在使用Ninject进行依赖注入,我不太确定using语句在更新后的代码中会有什么样的效果,因为Ninject已经创建了PopClient的一个实例并将其注入到构造函数中。

using语句会处理掉pop3对象而不去管popClient对象吗?还是说using语句会干扰Ninject?

在这种情况下,正确的方法是什么?任何洞察力都会非常有帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-10 22:31:27

pop3变量将被赋予与popClient相同的对IPopClient对象的引用,因此当using语句结束时,由本地变量和实例变量引用的对象将是Dispose()d,这可能会使其处于不一致的状态以供进一步使用。

如果你想使用多个IPopClient实例,每个Fetch()调用一个,你应该做的是注入一个“工厂方法”:

代码语言:javascript
运行
AI代码解释
复制
public class MyProvider
{
    private readonly Func<IPopClient> createPopClient;

    public MyProvider(Func<IPopClient> popClientFactory)
    {
        this.createPopClient = popClientFactory;
    }

    public void Fetch()
    {
        using (var pop3 = createPopClient())
        {
            ....
        }
    }
}

现在,当您调用Fetch()时,它将执行工厂方法,该方法将返回对IPopClient的新引用,可以使用该引用,然后在不影响对该方法的任何其他调用的情况下将其清除。

AutoFac支持为注册类型注入工厂方法,而不需要任何额外的设置(我想,这就是它的名字的由来);我相信在配置一个()=>new PopClient()容器时,你需要显式地注册一个"getter“作为给定返回类型的工厂方法(这可以是一个简单的lambda解析方法,也可以使用对容器解析方法的调用)。

票数 18
EN

Stack Overflow用户

发布于 2012-09-10 22:26:04

在设置绑定时,声明作用域:

https://github.com/ninject/ninject/wiki/Object-Scopes

Ninject会在它为你创建的对象上调用dispose,所以确保你把dispose方法写在你给Ninject去处理的任何对象中。

票数 1
EN

Stack Overflow用户

发布于 2021-07-30 07:43:20

我喜欢@KeithS的回答,但我想用ConfigureServices、.NET核心依赖注入和MailKit.Net.Smtp添加一些更新。

https://docs.microsoft.com/en-us/dotnet/core/extensions/dependency-injection

给定下面的类:

代码语言:javascript
运行
AI代码解释
复制
public class MailService
{
    private readonly SmtpSettings _settings;
    private readonly Func<ISmtpClient> _smtpClientFactory;

    public MailService(SmtpSettings settings, Func<ISmtpClient> smtpClientFactory)
    {
        _settings = settings;
        _smtpClientFactory = smtpClientFactory;
    }

    public async Task SendEmailAsync(string to, string subject, MimeEntity body, CancellationToken cancellationToken = default)
    {
        var message = new MimeMessage();
        message.From.Add(MailboxAddress.Parse(_settings.UserName));
        message.To.Add(MailboxAddress.Parse(to));
        message.Subject = subject;
        message.Body = body;

        using (var smtpClient = _smtpClientFactory())
        {
            await smtpClient.ConnectAsync(_settings.Server, _settings.Port, SecureSocketOptions.StartTls, cancellationToken);
            await smtpClient.AuthenticateAsync(_settings.UserName, _settings.Password, cancellationToken);
            await smtpClient.SendAsync(message, cancellationToken);
            await smtpClient.DisconnectAsync(true, cancellationToken);
        }
    }
}

它可以像这样添加到ConfigureServices(IServiceCollection services)

代码语言:javascript
运行
AI代码解释
复制
services.AddTransient<ISmtpClient, SmtpClient>();
services.AddSingleton(provider =>
                 new Func<ISmtpClient>(() => provider.GetService<ISmtpClient>()));

Azure函数的完整Program.cs示例:

代码语言:javascript
运行
AI代码解释
复制
public static void Main()
{
    var host = new HostBuilder()
        .ConfigureFunctionsWorkerDefaults()
        .ConfigureAppConfiguration((hostContext, builder) =>
        {
            if (hostContext.HostingEnvironment.IsDevelopment())
            {
                builder.AddJsonFile("local.settings.json");
                //This will override any values added to local.settings.json - We will however follow the recommended approach for keeping secrets in dev 
                //https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-5.0&tabs=windows#register-the-user-secrets-configuration-source
                //builder.AddJsonFile("secret.settings.json");
                builder.AddUserSecrets<Program>();
            }

        })
        .ConfigureServices((hostContext, services) =>
        {
            var connectionString = hostContext.Configuration.GetConnectionString("DefaultConnection");
            services.AddDbContext<ApplicationDbContext>(options =>
                    options.UseSqlServer(
                    connectionString,
                    sqlServerOptions => sqlServerOptions.CommandTimeout(600)));

            services.AddHttpClient();

            var configuration = hostContext.Configuration;

            var smtpSettings = new SmtpSettings();
            configuration.Bind("Smtp", smtpSettings);
            services.AddSingleton(smtpSettings);

            services.AddTransient<ISmtpClient, SmtpClient>();

            services.AddSingleton(provider =>
                 new Func<ISmtpClient>(() => provider.GetService<ISmtpClient>()));

            services.AddTransient<MailService>();
        })
        .Build();

    host.Run();
}

用于注册和解析Func<T>的源代码:

https://stackoverflow.com/a/43763284/3850405

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12360271

复制
相关文章
BUG赏金 | 当我发现iFrame注入时的利用
iFrame注入是一种非常常见的跨站脚本攻击。它包括已插入到网页或文章内容的一个或多个iframe代码,或一般下载一个可执行程序或进行其他动作使网站访客的电脑妥协。在最好的情况下,谷歌可能会标注该网站“恶意”。最糟糕的情况是,站点所有者和访问者最终使用了受恶意软件感染的计算机。
Timeline Sec
2019/12/26
1.3K0
go: 当我们在使用sync.Map时,发生了什么
sync.Map是我比较喜欢的一个库,用了非常久,今天突发奇想瞧瞧它的实现。又一次被宇宙中第二NB的语言--go 折服了。 这里准备写一篇文章,讨论下当使用sync.Map执行操作的时候,会发生什么。
超级大猪
2020/07/06
9710
2018-11-23 当我们输入一条 SQL 查询语句时,发生了什么?
我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于 MySQL 的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有一个 ID 字段,在执行下面这个查询语句时:
Albert陈凯
2018/12/17
7880
2018-11-23 当我们输入一条 SQL 查询语句时,发生了什么?
什么情况下索引会失效?
1.单独引用复合索引里非第⼀位置的索引列 假如有INDEX(a,b,c), 当条件为a或a,b或a,b,c时都可以使用索引,
用户8639654
2021/07/30
6810
MySQL从库server-id相同会发生什么情况?
今天中午,尝试着将线上rds的一套主从复制架构重新给搭建成一主两从的架构,在搭建的过程中,遇到了一些有意思的问题,记录一下:
AsiaYe
2020/01/15
2.6K0
MySQL从库server-id相同会发生什么情况?
插入时,究竟发生了什么?(非开车,纯技术交流)
《MySQL自增ID,居然大部分人都搞错了?》中的作业题,有少量答对的人,但原理讲得不透,今天简单说下作业题中的答案,以及相关知识点。 作业题是这样的: drop table t1; create table t1(     id int not null auto_increment,     name varchar(10) unique,     count int default 0,     primary key(id),     index(name) )engine=innodb; ins
架构师之路
2022/06/06
4200
插入时,究竟发生了什么?(非开车,纯技术交流)
选择篇(011)-当我们这样做时会发生什么?
参考答案:A 解析: 这在JavaScript中是可能的,因为函数也是对象!( 原始类型之外的所有东西都是对象) 函数是一种特殊类型的对象。您自己编写的代码并不是实际的函数。该函数是具有属性的对象,此属性是可调用的。
齐丶先丶森
2022/05/12
1920
Socket hang up 是什么?什么情况下会发生?
关于 Socket hang up 最早是在一次服务压测中出现的,后来得到了解决,近期在 Node.js 服务迁移 K8S 容器中时又报出了此问题,核查原因之后发现是对容器的 CPU、内存大小做了限制引起的,这里总结下什么是 Socket hang up 及在什么情况下发生,该如何解决。
五月君
2019/12/05
38.6K0
如果网站的 Cookie 超过 4K,会发生什么情况?
众所周知,Cookie 是塞在请求头里的。如果 Cookie 太多,显然整个 HTTP 头也会被撑大。
业余草
2020/05/21
1.2K0
[Silverlight动画]转向行为 - 转向机车
转向机车类继承机车类并增加转向行为。每个行为都被定义成公开函数,在每帧或者一段时间间隔内调用以实现对应的转向力。通常所有转向力在调用之后再调用机车的update函数。 转向函数都是这样工作的:不管什么时候调用了一个转向函数,都会计算转向力,这个力用来确定机车是顺时针旋转还是逆时针旋转。比如,seek(寻找)函数会 计算出一个力,确保机车能从当前方向直接面向目标点。这或许会受到不止一个拥有转向行为的机车的影响,起初的寻找点,会在考虑避开或躲避后而改变。当这些 力叠加后,update函数才被调用,最终把一切都反
用户1172164
2018/01/16
9280
京东三面:什么情况会导致 MySQL 索引失效?
为了验证 MySQL 中哪些情况下会导致索引失效,我们可以借助 explain 执行计划来分析索引失效的具体场景。
Java程序猿
2022/07/29
6030
你知道 GO 中什么情况会变量逃逸吗?
Go 语言将这个以前我们写 C/C++ 时候需要做的内存规划和分配,全部整合到了 GO 的编译器中,GO 中将这个称为 变量逃逸
阿兵云原生
2023/02/16
4650
JavaScript类型在什么情况下会发生类型自动转换
大家都知道 JavaScript 是弱类型语言,而且 JavaScript 声明变量的时候并没有预先确定的类型,变量的类型就是其值的类型,也就是说变量当前的类型由其值所决定,夸张点说上一秒种的String,下一秒可能就是个Number类型了,这个过程可能就进行了某些操作发生了强制类型转换。虽然弱类型的这种不需要预先确定类型的特性给我们带来了便利,同时也会给我们带来困扰,为了能充分利用该特性就必须掌握类型转换的原理。
Javanx
2019/09/04
9310
JavaScript类型在什么情况下会发生类型自动转换
什么情况下 Java 程序会产生死锁?
死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。死锁不仅仅是在线程之间会发生,存在资源独占的进程之间同样也可能出现死锁。通常来说,我们大多是聚焦在多线程场景中的死锁,指两个或多个线程之间,由于互相持有对方需要的锁,而永久处于阻塞的状态。
葆宁
2019/04/18
7210
什么情况下 Java 程序会产生死锁?
面试突击60:什么情况会导致 MySQL 索引失效?
为了验证 MySQL 中哪些情况下会导致索引失效,我们可以借助 explain 执行计划来分析索引失效的具体场景。
磊哥
2022/06/30
2.2K0
面试突击60:什么情况会导致 MySQL 索引失效?
什么是跨域?什么情况下会发生跨域请求?
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。
全栈程序员站长
2022/09/02
7690
面试突击83:什么情况会导致@Transactional事务失效?
一个程序中不可能没有事务,而 Spring 中,事务的实现方式分为两种:编程式事务和声明式事务,又因为编程式事务实现相对麻烦,而声明式事务实现极其简单,所以在日常项目中,我们都会使用声明式事务 @Transactional 来实现事
磊哥
2022/09/27
3650
面试突击83:什么情况会导致@Transactional事务失效?
Maven项目导入时,org .apache.maven.plugins依赖爆红报错
这种情况我推荐的方法是,首先清空依赖重装看看行不行,不行直接删除本地依赖文件夹,重下,快速有效,至少我是这样的。
JanYork_简昀
2022/08/29
7570
Maven项目导入时,org .apache.maven.plugins依赖爆红报错
Android 面试黑洞——当我按下 Home 键再切回来,会发生什么?
很多 Android 工程师在投简历找工作之前,会去补习一下 Activity 的启动模式(launchMode),因为面试的时候经常会考。但真正把它搞懂的人是很少的——包括不少拿它做面试题的面试官。
扔物线
2020/10/26
1.8K0
Android 面试黑洞——当我按下 Home 键再切回来,会发生什么?
MySQL联合索引使用分析 彻底搞清楚什么情况下会走索引
快速生产10万数据方法,执行main方法后,会将sql文件存入E盘,放到MySQL执行就行了
全栈程序员站长
2022/09/05
5510

相似问题

当我们使用webpack和ES6导入时,会发生什么情况?

11

依赖SQLite杂注语句安全吗?

12

当我键入时WebStorm会延迟

28

当我使用"Reader monad“进行依赖注入时,如何注入多个依赖?

21

当我插入时,MaskTextInputFormatter会擦除字符

114
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文