Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 没有接口的StructureMap构造函数注入?_Asp.net Mvc_Interface_Inversion Of Control_Structuremap - Fatal编程技术网

Asp.net mvc 没有接口的StructureMap构造函数注入?

Asp.net mvc 没有接口的StructureMap构造函数注入?,asp.net-mvc,interface,inversion-of-control,structuremap,Asp.net Mvc,Interface,Inversion Of Control,Structuremap,我正在建立一个MVC项目。看起来像这样 EfDbContext : IDbContext { ... } MyStuff : IMyStuff { ... } MyService : IMyService { List<things> GetSomething(IDbContext context, IMyStuff stuff) { ... } } MyController : Controller { ActionResult MyAction(IMyServ

我正在建立一个MVC项目。看起来像这样

EfDbContext : IDbContext { ... }

MyStuff : IMyStuff { ... }

MyService : IMyService {
   List<things> GetSomething(IDbContext context, IMyStuff stuff) { ... }
}

MyController : Controller { 
   ActionResult MyAction(IMyService service) { ... }
}
当然,我仍然希望使用StructureMap实现所有基于约定的自动连接,因此我不必逐一指定它们


谢谢。

经过进一步测试,StructureMap.MVC注入任何东西似乎都没有问题。构造函数参数中的具体类被注入,甚至不需要手动配置。但测试中的嘲笑似乎是问题所在。若并没有接口,我必须将所有方法标记为虚拟,并在测试中指定构造函数参数。有一些观点认为这会使测试更容易受到攻击。有什么建议吗?感谢我的理解,你不应该仅仅用具体的类替换接口,因为接口和类的比例为1:1是不好的。我听到Mark说,比例为1:1意味着应用程序中存在架构问题,使用了糟糕的抽象。阅读他的一些关于如何改进设计的例子。谢谢你的跟进。正是这篇文章让我想到了这个问题。我的应用程序通常很简单,同一个服务永远不会有不同的实现。即使是IDbContext,我也不打算使用EfDbcontext以外的任何内容。因此,接口只是用于IoC和单元测试模拟,而不是抽象。我读到你可以把所有东西都标记为虚拟的,并嘲笑课堂,但也存在分歧。所以我不确定我能做什么不同的事情。需要抽象的一件常见事情是交叉关注点,如日志记录、授权、缓存等。解决这些关注点的一种常见方法是使用Decorator模式,有效地引入接口的第二个实现。代码中是否有if语句?==一个接口/基类的多个实现。我在上一个项目中使用了Agatha RRSL,它使用“拦截器”来添加横切内容。它还内置了服务/客户端缓存。所有请求基本上都是多态基本请求,因此您可以在一次往返中批处理一组不同的请求。相当整洁。可惜它有点休眠。我正在为我当前的MVC项目使用自定义过滤器。我知道这仍然是一种实现,而不是抽象。但我怀疑我是否会有一个不同的实现。一旦完成,就完成了。不管怎么说,似乎我什么都做了:什么都只为了IoC和单元测试?
GetSomething(IDbContext context, MyStuff stuff) {}
MyAction(MyService service) {}