【发布时间】:2021-11-28 11:15:03
【问题描述】:
在 .NET Core 3.1 控制台应用程序中,我想要一个在构造函数中注入一些参数但我可以手动分配的类。例如类似的东西,但注入了 IConfiguration:
static void Main() {
var myObj1 = new MyClass(1);
var myObj2 = new MyClass(2);
}
public class MyClass {
public MyClass(IConfiguraiton config, int myVal)
{
}
}
我用 Ninject 试过这个:
static void Main()
{
kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
kernel.Get<MyClass>();
}
public class MyClass
{
public MyClass(IConfiguraiton config)
{
}
}
public class Bindings : NinjectModule
{
public override void Load()
{
var configuration = new ConfigurationBuilder().AddJsonFile($"appsettings.json").Build();
Bind<IConfiguration>().ToMethod(ctx => SetupConfiguration()).InSingletonScope();
Bind<MyClass>().ToSelf().InTransientScope();
}
}
我设法进行了简单的依赖注入,但没有成功使用参数进行注入。
我读过很多人建议最好将参数传递给类的方法而不是构造函数,但是在我的情况下,这不是一个选择,另外我是一名软件工程专业的学生,并且希望了解如何执行此操作,因为它在某些情况下可能很有用。
【问题讨论】:
-
如果你想自己创建依赖注入有什么意义?将这些值封装到注入到类中的另一个配置提供程序等中。
-
是的,这个有点不适合。你可以做些什么来解决它是使用属性注入(NInject 支持它),然后像
var my = new MyClass { myProp = 1 };那样在初始值中提供你的其他属性。然而,属性注入通常是不受欢迎的,因为开发人员不清楚哪些东西被注入了,哪些东西没有被注入,并且在测试代码时很容易错过一些 -
另外 -
however in my situation this isn't an option in addition- 为什么不呢? -
注入值的作用是什么?这个值是恒定的,在应用程序运行时不改变,并且在启动时可用,或者更确切地说是一个可能在每个请求上改变的运行时值。或者可能介于两者之间。请描述其功能和起源;正确的解决方案在很大程度上取决于您给出的答案。
-
好的,很抱歉关于上下文的信息太少了。所以 MyClass 将是一个负责下载网站文件的类。因此,我想要传递的值将是指向该网站的链接。我不想将值传递给方法,因为在这个类中会有很多方法使用链接,所以使用构造函数会更有意义吗?我不能在配置中拥有该值,因为我将创建该类的多个实例来从不同的网站下载文件。
标签: c# dependency-injection ninject .net-core-3.1