【问题标题】:Can I make an ASP.NET Core controller internal?我可以在内部制作 ASP.NET Core 控制器吗?
【发布时间】:2017-01-24 09:50:31
【问题描述】:

ASP.NET(和 Core)控制器必须是 public

问题是我有一个控制器,它依赖于(在其构造函数中)internal。而且这种依赖取决于内部的东西,它取决于内部的东西等等。所以我还需要制作控制器internal

但是控制器工厂不会发现它。

有没有办法让internal 控制器被发现?

【问题讨论】:

  • 你能发布你所说的这个依赖吗?公共高于内部,如果依赖是内部的,这并不重要。除非它在构造函数中
  • @DevEstacion 是的,在构造函数中。
  • 那就不要将其作为参数注入,在构造函数声明中实例化它或提供使用它的方法。
  • @DevEstacion 在我的情况下不可能,它应该通过构造函数注入进入那里。

标签: c# asp.net asp.net-core


【解决方案1】:

如果您想包含内部控制器,您可以提供自己的ControllerFeatureProvider 类实现,该类负责确定类型是否为控制器。在下面的示例中,我创建了一个实现,它查找实现自定义基类的控制器并在所有其他情况下回退到默认实现。在这种情况下,尽管是内部的,但自定义控制器将是可发现的,而所有其他控制器则不会。

class CustomControllerFeatureProvider : ControllerFeatureProvider
{
    protected override bool IsController(TypeInfo typeInfo)
    {
        var isCustomController = !typeInfo.IsAbstract && typeof(MyCustomControllerBase).IsAssignableFrom(typeInfo);
        return isCustomController || base.IsController(typeInfo);
    }
}

并注册它:

services.AddMvc().ConfigureApplicationPartManager(manager =>
{
    manager.FeatureProviders.Add(new CustomControllerFeatureProvider());
});

您可能应该看看IsControllerimplementation 以了解 ASP.NET 如何处理类型周围的边缘情况。

【讨论】:

  • Ty,这是一个完美的解决方案。我唯一想说的是,如果您使用services.AddControllers() 而不是services.AddMvc() - 那也很好。
【解决方案2】:

你有这个(在你的问题中包含MCVE 总是有帮助的):

internal class FooDependency
{

}

public class FooController
{
    public FooController(FooDependency dependency)
    {
        // ...
    }
}

你不能公开FooDependency,但你需要FooController 公开?

那么你需要对内部依赖应用一个公共接口:

public interface IFooDependency
{

}

internal class FooDependency : IFooDependency
{

}

public class FooController
{
    public FooController(IFooDependency dependency)
    {
        // ...
    }
}

【讨论】:

  • 这并不总是适合设计,但在我的情况下确实如此,谢谢。最好能够配置控制器工厂以找到特定的内部控制器,但我不确定这是否可能。
  • 仍然流血/强制公共类型。没有理由需要公开接口:|
猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 2018-11-04
  • 2021-09-21
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多