问题标签 [light-inject]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
199 浏览

c# - LightInject IoC 容器中的 ObjectFactory.GetInstance 模拟

LightInject IoC 容器中是否有“ObjectFactory.GetInstance”的类似物?

例如,我需要在继承自 IServiceBehavior 的自定义行为属性中解析接口,但默认情况下我需要的接口没有解析。

0 投票
1 回答
293 浏览

c# - LightInject - 拦截不拦截依赖项

我在 MVC 网站上将 LightInject 与 ServiceProvider 适配器一起使用。我正在尝试将其连接到 MiniProfiler,但我运气不佳。MiniProfiler 似乎正在捕获 MVC 控制器生命周期,但没有捕获任何依赖项: Mini Profiler Image Profiling Dump(我在此屏幕截图中进行调试 - 忽略 61,744 毫秒的持续时间)

这就是我初始化容器的方式:

拦截器如下所示:

这是控制器和测试依赖项:

我在拦截器代码中设置了一个断点。它从不为任何事情进入拦截器SomeDependency,但它为 MVC 生命周期中的每个操作进入SomeDependencyController

0 投票
2 回答
1618 浏览

c# - 未解决的依赖[类服务层]

我在 asp mvc 中使用光注入。

在 asp mvc 的 global.asax 中使用此代码。

在控制器中:

但它告诉我这个错误:

未解决的依赖[目标类型:DA.Service.Service.NewsService],[参数:存储库(DA.Data.Repository.Repository 1[DA.Data.Domain.News])], [Requested dependency: ServiceType:DA.Data.Repository.Repository1[DA.Data.Domain.News],ServiceName:]

有什么问题 ?

0 投票
0 回答
943 浏览

c# - LightInject - .net 核心中没有为此对象定义无参数构造函数

我在使用 lightinject 和 .net 核心检索实例时遇到问题。最初这是一组全面的类等,但我已经简化了它。

在我的启动类中, ConfigureServices 方法我有以下代码;

第三行产生异常;

有问题的类 HasEnum 在这里;

根据异常的建议,我向 HasEnum 添加了一个默认构造函数,结果相同。非常令人抓狂的是,当我在一个单独的(高度简化的)项目中尝试这个时,它似乎工作正常。我已经检查了两个项目中 lightinject 的版本并且它们匹配。我是否在不知不觉中设置了某种设置?

非常感谢

编辑 - 奇怪的是,如果我从 PickedColour 属性中删除设置器,则不会发生此错误。

所以这似乎与这个枚举属性上的设置器有关。即使我放置了一个空白集{},这个异常也会抛出。

编辑 2:IHasEnum 接口;

编辑3:感谢您的回复。在 .net 核心中使用 lightinject 方面,没有大量的文档。.net 核心特定版本告诉您像这样使用它:http ://www.lightinject.net/microsoft.dependencyinjection/

我遵循了这一点,我的测试类的错误仍然存​​在。如果我通过删除枚举类型来简化测试类,它就可以正常工作。

为了进一步明确我是如何注册服务的,下面是跨多个文件和类的相关片段;

除了相关部分之外,我已经删除了所有内容。当执行到达主控制器并且我尝试获取 IHasEnum 实现时,同样的异常结果。我已经按照文档使用了注册,不知道如何让它工作。

非常感谢。

编辑4:

我已经缩小了错误的来源 - 但不明白为什么会发生。IHasEnum 的实现是一个红鲱鱼 - 它正在正确注册。我找到了一个实现 ICompsitionRoot 的类——一旦我删除了这个用法,就会检索 HasEnum 实例。根据 lightInject 文档(http://www.lightinject.net/#composition-root),任何实现 ICompositionRoot 的类都将在设置 DI 时执行。实现此接口的组合类对于从 appsettings.json 文件构造设置对象是必要的。

为了证明这一点,我将再次展示 AddPocCore 方法,添加的行带有对构成 Configuration 组合 Root 的扩展方法的调用;

所以本质上,只要我删除对扩展方法的调用,然后在 ConfigurationCompositionRoot 中,我从类声明中删除 ICompositionRoot(阻止 lightinject 拦截它),程序就会按预期工作。我只是不明白如何在启动时使用此组合根将我的设置放入对象中。整个事情变得相当长,对此感到抱歉 - 只是真的想让它与 dot net core 一起工作。

再次感谢。

0 投票
1 回答
1842 浏览

c# - Winforms IOC 容器 - 组合根

我最近一直在涉足 IOC 容器(在我的例子中是 LightInject)。

我一直在阅读,您应该只需要在启动时使用容器一次,而无需在其他地方使用。这是我很难理解的。如果我只能在引导/启动方法中引用容器,那么如果类依赖于用户输入,如何在项目中的其他地方或运行时解决我需要的内容。

因此,在我的传统 Windows 窗体应用程序中,在表单加载时,我将按照以下代码引导 Lightinject。这只是一个任意的例子,它更像是我需要了解的前提。

我可能在这里完全错过了一些东西,或者只是没有得到它。但是我应该如何解决依赖关系,如果我不能使用/不应该引用或使用 Container.GetInstance/Resolve/{Choose IOC Syntax Here},并且只能在组合根中。

例如,假设我的表单上有两个按钮和一个 TextBox。第一个按钮给我一个 ILoader(下面的代码),第二个按钮加载一个文件查看器(ILoader,下面的代码),其文件名是输入到 winform 上的文本框中的文件名。

如果没有 IOC 容器,我会执行以下操作(假设将其放入 click 事件中)

按钮 1 单击事件:

按钮 2(根据文本框输入获取文件阅读器)

使用 LightInject,我肯定不得不执行以下操作:

Button1 点击:

按钮 2 单击

我不正确吗?在一个大型项目中,我会有 Container.GetInstance,到处都是,在主表单文件和其他地方,所以我怎么能只在一个地方引用容器,以引导程序的形式,我错过了一个魔法一块拼图?

在我见过的所有示例应用程序中,这一切都在一个简单的控制台应用程序中完成,在 Main 函数中。所有这些应用程序都遵循以下格式:

嗯,我明白这一切,而且非常简单。一旦您开始为应用程序本身添加一些复杂性,我就迷失了如何在不使容器本身公开、静态或以某种方式、形状或形式访问然后调用 Container.GetInstance 的情况下获取实例在一百万个地方(显然,这是一个很大的禁忌)。请帮忙!干杯,

楚德

PS - 我不关心“抽象容器”本身。所以宁愿只专注于增加我对上述内容的理解。

编辑#1

好的,所以,在重新阅读评论并在互联网上查看更多示例之后,我想我可能终于明白了。问题是(我认为)是我对“更高层次”的思考不够。我试图在我的 winforms 应用程序中解决我的依赖关系,在表单已经构建之后,在表单本身中。到了现实时,为时已晚。我并没有将“表单本身”视为另一个对象,它需要将其依赖项注入其中。

所以我现在在我的 Program.cs 中引导:

我现在的问题是,就winforms而言,我的思路现在是否正确。似乎更有意义,将我的方法更改为“更高”的链条并从 Program.cs 解决?

其次,我不确定这是否完全需要一个新问题,请告知,因为我是一个菜鸟。

我将如何设置工厂以返回对象的正确实例?原始评论之一表明这将是这种情况下的用法。让我们使用一个人为的例子。我需要一个对象,但直到运行时/用户输入才知道哪个对象。

我的想法:

BootStrap Container.Register();

工厂接口和实现:让我们也放入一些可选参数,因为我想知道这是否是正确/最好的方法?

形式:

按钮点击:

或者:

所以最后,我的问题是:

  1. 我的“更高层次”思维的新方式,以及从 Program.cs 引导现在是否正确
  2. 如何处理 LightInject 中的可选参数
  3. 我如何设置我的工厂是正确的方法吗?
  4. 让我们忘记工厂的琐碎性,而只是尝试研究问题的机制:)
0 投票
1 回答
275 浏览

c# - 为 Prism 创建 LightInject Bootstrapper,缺少区域适配器的注册

我正在尝试为 Prism 创建一个 LightInject 引导程序,我复制了NinjectBootstrapper( source ) 的代码并将 Ninject 替换IKernel为 LightInject IServiceContainer。我还创建并注册了一个LightInjectServiceLocatorAdapterNinject 版本)。

注册和服务定位器适配器正在工作。我看到该类RegionAdapterMappings已从服务定位器中成功检索。

在引导程序的步骤中,从服务定位器请求ConfigureRegionAdapterMappings一个类的实例。SelectorRegionAdapter这失败了。该课程从未注册过。我在NinjectBootstrapper. 那么 Ninject 引导程序是如何检索这个类的呢?

我已经尝试手动注册该类(以及更多的区域适配器和DelayedRegionCreationBehavior),但随后 Prism 失败并出现UpdateRegionsException

我找不到任何处理创建添加自己的 DI 容器的来源,我不知道我错过了哪一步。我究竟做错了什么?

ServiceContainer像这样配置我的(Ninject 等价的ConfigureKernel方法)。

0 投票
1 回答
684 浏览

c# - C# LightInject - 如何用另一个替换包含中的实例

假设我有 ClassA 和 ClassB 从 IClass 继承。现在我有一个 LightInject 容器并将 ClassA 的实例注册为

现在我想用 classB 替换 classA 作为

这样当我尝试获取另一个类中的实例时,可以获取 classB 而不是 classA

但是,当我尝试获取实例时,我总是得到 classA。我怎么解决这个问题?谢谢你。

更新:

我有一个 IF 语句来控制我要注册哪个实例,例如

在我的代码中,第一轮,条件为真。因此,我将 classA 注册到容器中。第二轮,条件为假。因此,我希望 classB 将注册到容器中。当我尝试获取实例时,我将在第一轮之后获得 classA,然后在第二轮获得 classB。但是,目前的情况是,在两轮中,我都获得了A类。

0 投票
0 回答
103 浏览

inversion-of-control - 获取服务实例时 LightInject 中的问题

我已经在 web api 项目中集成了 Light Inject。我能够在 global.asax 的 application_start 中成功注册服务。我正在使用需要在 global.asax 的 application_start 中注册的过滤器。过滤器构造函数引用了注册的服务,但是我无法获取服务实例。示例代码:服务注册如下:

过滤器注册需要 ILogger 的实例。使用以下代码:

尝试 getService 时收到错误,即未注入/注册 lightinject 模块。我无法升级到 .net framework 4.5 左右。

非常感谢任何帮助。谢谢

0 投票
1 回答
1588 浏览

c# - Using LightInject to register all classes that implement a generic interface

I can't figure out how to use LightInject's API to register all handlers defined in a given class. In this case, defining handlers for Rebus using the LightInject adapter.

So given a handler defined as:

I thought I could register all in the assembly as follows:

but when I try to get instances registered of that type they are not found (container.AvailableServices shows the type but the value property is null)

What does work, is manually defining it as follows:

but that's not ideal as it requires manual registration. Is there a way to do it with LightInject?

0 投票
1 回答
752 浏览

c# - LightInject GetInstance 返回不能与类型参数一起使用

我是依赖注入的新手,我发现 LightInject 开始了。所以我创建了 2 个接口并将这些接口实现为 2 个类。现在,我想获得一个 Payment 实例,但编译器一直说非泛型方法 'ServiceContainer.GetInstance(Type) 不能与类型参数一起使用。

我的接口在不同的文件中实现。我尝试了这些人所说的方式(LightInject 入门)并且工作正常。但我认为,不知何故,由于我的接口和类位于不同的文件中,它不起作用我不知道为什么。

我的代码是这样的。合同

付款方式:

疯狂合约:

付款和更重要的课程:

和我的主要返回错误:

和错误:

正如你们所看到的,我正在使用构造函数注入,如果你们中的任何人能解释我做错了什么,我会非常高兴。谢谢!