ASP.NET(和Core)控制器需要public
。
问题是我有一个控制器,它依赖于internal
(在它的构造函数中)。这种依赖取决于内部的东西,这取决于内部的东西,等等。所以我需要制作控制器internal
。
然后它不会被控制器工厂发现。
有没有办法让internal
控制器可被发现?
答案 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如何处理类型的边缘情况。