我可以在内部创建ASP.NET核心控制器吗?

时间:2017-01-24 09:50:32

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

ASP.NET(和Core)控制器需要public

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

然后它不会被控制器工厂发现。

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

2 个答案:

答案 0 :(得分:6)

你有这个(在你的问题中包括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)
    {
        // ...
    }
}

答案 1 :(得分:4)

如果要包含内部控制器,可以提供自己的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());
});

您应该查看IsController的{​​{3}},了解ASP.NET如何处理类型的边缘情况。