- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是 autofac 3.5.x,我的设置与此类似:
public class ServiceA : IServiceA { }
public class ServiceB : IServiceB { public ServiceB(IServiceA sa) { } }
public class ServiceC : IServiceC { public ServiceC(IServiceA sa) { } }
public class ServiceD : IServiceD { public ServiceD(IServiceA sa, IServiceB sb, IServiceC sc) {} }
在我的容器中,我有以下注册:
builder.RegisterType<ServiceA>.As<IServiceA>();
builder.RegisterType<ServiceB>.As<IServiceB>();
builder.RegisterType<ServiceC>.As<IServiceC>();
builder.RegisterType<ServiceD>.As<IServiceD>();
这就是我想要的:当我从容器中请求一个新的 IServiceD
时,我希望将相同的 IServiceA
实例注入(inject)到 IServiceD
及其依赖项 IServiceB
和 IServiceC
。不过,我并不是在寻找全局单例范围。下次我请求 IServiceD
实例时,它必须用 IServiceA
的新实例创建(我知道你不能创建接口(interface)实例,但我想你明白了)。
举例说明;当我向 autofac 容器询问 IServiceD
时,我希望发生以下情况:
public class ServiceD : IServiceD
{
public ServiceD(IServiceA sa, IServiceB sb, IServiceC sc)
{
// SA should be the same (but it is not)
sa.GetHashCode() == sb.GetServiceA().GetHashCode() == sc.GetServiceA().GetHashCode()
}
}
请注意,包含 GetServiceA()
方法只是为了说明我的观点。
是的,我想我正在寻找一些方法来告诉 autofac,当它解析 IServiceD
时,它应该创建 ServiceA
的单例,但仅限于 ServiceD
的构造函数。
现在,我对委托(delegate)工厂使用 autofacs 支持,并要求:
public ServiceD(IServiceA sa, Func<IServiceA, IServiceB> fb, Func<IServiceA, IServiceC> fc) : IServiceD
{
var sb = fb(sa); // Manually inject the same instance of ServiceA
var sc = fc(sa); // Manually inject the same instance of ServiceA
// ServiceA is now the same instance
sa.GetHashCode() == sb.GetServiceA().GetHashCode() == sc.GetServiceA().GetHashCode()
}
这让我继续前进,但我觉得它可以做得更好 - 这就是我现在求助于专家的原因。
提前致谢。
最佳答案
InstancePerLifetimeScope
可能适合您的需要。它允许您在每个生命周期范围内拥有一个实例。
builder.RegisterType<ServiceA>().As<IServiceA>().InstancePerLifetimeScope();
builder.RegisterType<ServiceB>().As<IServiceB>().InstancePerLifetimeScope();
builder.RegisterType<ServiceC>().As<IServiceC>().InstancePerLifetimeScope();
builder.RegisterType<ServiceD>().As<IServiceD>().InstancePerLifetimeScope();
然后,每次你解析IServiceD
在新范围内,您将拥有一个 IServiceA
实例
using (ILifetimeScope scope = container.BeginLifetimeScope())
{
// only an instance of IServiceA will be created for this scope
scope.Resolve<IServiceD>();
}
如果您无法创建新的 ILifetimeScope
你可以使用 Owned<T>
type 是一个轻量级的生命周期。
using (Owned<IServiceD> ownedD = container.Resolve<Owned<IServiceD>>())
{
IServiceD serviceD = ownedD.Value;
}
每次你解决 Owned<IserviceD>
一个新的ILifetimeScope
将被创建并且只有一个 IServiceA
将被创建。
如果不够你可以玩 InstancePerMatchingLifetimeScope
但它会使您的代码和注册很难阅读和调试。 InstancePerLifetimeScope
应该够了。
另一种解决方案是使用这种注册方式。
builder.Register(ctx =>
{
IServiceA serviceA = ctx.Resolve<IServiceA>();
IServiceB serviceB = ctx.Resolve<IServiceB>(TypedParameter.From(serviceA));
IServiceC serviceC = ctx.Resolve<IServiceC>(TypedParameter.From(serviceA));
IServiceD serviceD = ctx.Resolve<IServiceD>(TypedParameter.From(serviceA), TypedParameter.From(serviceB), TypedParameter.From(serviceC));
return serviceD;
}).As<IServiceD>();
但不是很优雅。
关于c# - 使用 "constructor scope"注入(inject)依赖 - autofac,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30951035/
我正在尝试测试依赖于其他服务 authService 的服务 documentViewer angular .module('someModule') .service('docu
如果我的网站上线(不要认为它会,目前它只是一个学习练习)。 我一直在使用 mysql_real_escape_string();来自 POST、SERVER 和 GET 的数据。另外,我一直在使用 i
我有以下代码,它容易受到 SQL 注入(inject)的攻击(我认为?): $IDquery = mysqli_query($connection, "SELECT `ID` FROM users W
我一直在自学如何创建扩展,以期将它们用于 CSS 注入(inject)(以及最终以 CSS 为载体的 SVG 注入(inject),但那是以后的问题)。 这是我当前的代码: list .json {
这个简单的代码应该通过 Java Spring 实现一个简单的工厂。然而结果是空指针,因为 Human 对象没有被注入(inject)对象(所以它保持空)。 我做错了什么? 谢谢 配置 @Config
我正在编写一个 ASP.NET MVC4 应用程序,它最终会动态构建一个 SQL SELECT 语句,以便稍后存储和执行。动态 SQL 的结构由用户配置以用户友好的方式确定,具有标准复选框、下拉列表和
首先让我说我是我为确保 SQL 注入(inject)攻击失败而采取的措施的知己。所有 SQL 查询值都是通过事件记录准备语句完成的,所有运算符(如果不是硬编码)都是通过数字白名单系统完成的。这意味着如
这是 SQL 映射声称可注入(inject)的负载: user=-5305' UNION ALL SELECT NULL,CONCAT(0x716b6b7071,0x4f5577454f76734
我正在使用 Kotlin 和 Android 架构组件(ViewModel、LiveData)构建一个新的 Android 应用程序的架构,并且我还使用 Koin 作为我的依赖注入(inject)提供
假设 RequestScope 处于 Activity 状态(使用 cdi-unit 的 @InRequestScope) 给定 package at.joma.stackoverflow.cdi;
我有一个搜索表单,可以在不同的提供商中搜索。 我从拥有一个基本 Controller 开始 public SearchController : Controller { protected r
SQLite 注入 如果您的站点允许用户通过网页输入,并将输入内容插入到 SQLite 数据库中,这个时候您就面临着一个被称为 SQL 注入的安全问题。本章节将向您讲解如何防止这种情况的发生,确保脚
我可以从什么 dll 中获得 Intercept 的扩展?我从 http://github.com/danielmarbach/ninject.extensions.interception 添加了
使用 NInject 解析具有多个构造函数的类似乎不起作用。 public class Class1 : IClass { public Class1(int param) {...} public
我有一个 MetaManager 类: @Injectable() export class MetaManager{ constructor(private handlers:Handler
我是 Angular 的新手,我不太清楚依赖注入(inject)是如何工作的。我的问题是我有依赖于服务 B 的服务 A,但是当我将服务 A 注入(inject)我的测试服务 B 时,服务 B 变得未定
我正在为我的项目使用 android 应用程序启动、刀柄和空间。我在尝试排队工作时遇到错误: com.test E/WM-WorkerFactory: Could not instantiate co
我不确定这是什么糖语法,但让我向您展示问题所在。 def factors num (1..num).select {|n| num % n == 0} end def mutual_factors
简单的问题,我已经看过这个了:Managing imports in Scalaz7 ,但我不知道如何最小化注入(inject) right和 left方法到我的对象中以构造 \/ 的实例. 我确实尝
在我的 Aurelia SPA 中,我有一些我想在不同模块中使用的功能。它依赖于调用时给出的参数和单例的参数。有没有办法创建一个导出函数,我可以将我的 Auth 单例注入(inject)其中,而不必在
我是一名优秀的程序员,十分优秀!