C# 如何解决MVC控制器与简单注入器之间存在值类型依赖关系?
我有以下控制器:C# 如何解决MVC控制器与简单注入器之间存在值类型依赖关系?,c#,asp.net-mvc,simple-injector,C#,Asp.net Mvc,Simple Injector,我有以下控制器: public class MyController : Controller { private readonly IService service; private readonly int intDependency; public MyController(IService service, int intDependency) { this.service = service; this.intDependenc
public class MyController : Controller {
private readonly IService service;
private readonly int intDependency;
public MyController(IService service, int intDependency) {
this.service = service;
this.intDependency = intDependency;
}
...
}
显然,解析不起作用,我也不能使用委托提供构造函数参数,因为这将导致多个构造函数注册
在这种情况下,正确的处理方法是什么?作为依赖项的值类型通常不正确吗?将依赖项包装在接口后面会更好吗
作为依赖项的值类型通常不正确吗
事实上,正如您所看到的,喷油器无法知道必须注入哪个int
。没什么意义
将依赖项包装在接口后面会更好吗
对
在这种情况下,正确的处理方法是什么
你说对了。接口或类
例如:
public class MyConfig
{
public int MyInt {get; set;}
}
您可以这样配置SimpleInjector:
container.RegisterSingleton(new MyConfig { MyInt = 42 });
您的控制器是:
public MyController(IService service, MyConfig config) { ...
注意:有一种注入基元类型的方法:
但是,像我的示例那样,将原语封装在类中更简单、更干净
作为依赖项的值类型通常不正确吗
事实上,正如您所看到的,喷油器无法知道必须注入哪个int
。没什么意义
将依赖项包装在接口后面会更好吗
对
在这种情况下,正确的处理方法是什么
你说对了。接口或类
例如:
public class MyConfig
{
public int MyInt {get; set;}
}
您可以这样配置SimpleInjector:
container.RegisterSingleton(new MyConfig { MyInt = 42 });
您的控制器是:
public MyController(IService service, MyConfig config) { ...
注意:有一种注入基元类型的方法:
但是,像我的示例那样,将原语封装在类中更简单、更干净
将依赖项包装在接口后面会更好吗
是的,这将是建议的解决方案。不支持值类型。不要直接注入值,而是将其封装在类中并注入
将接口置于实现之上的最佳实践,但这不是必需的。简单的喷油器没关系。因此,这将起作用:
public class Values
{
public Values(int value)
{
this.SomeValue = value;
}
public int SomeValue { get; }
}
// Register as
container.RegisterSingleton<Values>(() => new Values(1));
公共类值
{
公共值(int值)
{
this.SomeValue=value;
}
公共int SomeValue{get;}
}
//注册为
container.RegisterSingleton(()=>新值(1));
有很多选择,虽然有点难看,但我不想这样做。这些都被描述了
将依赖项包装在接口后面会更好吗
是的,这将是建议的解决方案。不支持值类型。不要直接注入值,而是将其封装在类中并注入
将接口置于实现之上的最佳实践,但这不是必需的。简单的喷油器没关系。因此,这将起作用:
public class Values
{
public Values(int value)
{
this.SomeValue = value;
}
public int SomeValue { get; }
}
// Register as
container.RegisterSingleton<Values>(() => new Values(1));
公共类值
{
公共值(int值)
{
this.SomeValue=value;
}
公共int SomeValue{get;}
}
//注册为
container.RegisterSingleton(()=>新值(1));
有很多选择,虽然有点难看,但我不想这样做。这些都被描述了hmm,这几乎是完全相同的答案!结构呢?它们是值类型,但行为类似于引用类型。嗯,这几乎是完全相同的答案!结构呢?它们是值类型,但行为类似于引用类型。似乎我在键入时读到了你的心思。。。同样的答案同样的文章,我刚刚看到了你的答案。好像我在打字的时候读到了你的心思。。。同样的答案同样的文章,我刚刚看到你的答案。