【发布时间】:2021-01-17 18:10:04
【问题描述】:
上下文是 ASP.NET Core。
请考虑以下最小设置。
public class ExampleController : ControllerBase
{
public ExampleController(IExempleService exampleService)
{
(...)
public interface IExampleService
{
ExampleStruct Foo();
}
public readonly struct ExampleStruct (...)
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IInverterService, InverterService>();
这里有一个宣传链。
- 控制器必须是公共的;可以被发现。 公平。
- 控制器的构造函数必须是公共的;让框架实例化它。 这就是生活。
- 服务接口必须是公共的,因为控制器的构造函数是公共的。 悲伤。
- 服务类型(例如 ExampleStruct)必须是
public,因为接口是公共的。 我觉得恶心。
这样做有实际的后果:
- 文档,我正在记录实际上是内部但技术上公开的类,其中包含将变得过时的毫无意义的 cmets。
- 公共类型有更多的责任。例如,内部结构不需要提供相等性,但当它是公共的时它应该提供。
我想这里有两个问题:
- 最终会为这种公共访问的僵尸病毒找到结构性解决方案吗?
- 是我做错了吗,现在有好的解决方案吗?
单元测试和internal 与InternalsVisibleToAttribute 一起使用。
【问题讨论】:
-
您可以使您的控制器内部化,您只需使用
ControllerFeatureProvider使其可被发现@看看这个stackoverflow.com/a/50906593/1612975 -
@MichaelRandall 这很有趣。我不是OP,但感谢您的链接! :)
-
@MichaelRandall 您能否将您的评论作为答案,我将添加我的设置
MyControllerFeatureProvider。或者,如果您更喜欢只做一个简短的回答,我会将我的答案发布在旁边并接受您的回答。我希望将功劳归于您,而不是我发布答案并将其标记为已接受。
标签: c# .net asp.net-core dependency-injection scope