需要注意的是,DefaultControllerActivator中的控制器实例是从TypeActivatorCache获取的,而自己的激活器是从DI获取的,所以必须额外把系统所有控制器注册到DI中,封装成如下的扩展方法:
/// <summary>
/// 自定义控制器激活,并手动注册所有控制器
/// </summary>
/// <param name="services"></param>
/// <param name="obj"></param>
public static void AddHosControllers(this IServiceCollection services, object obj)
{
services.Replace(ServiceDescriptor.Transient<IControllerActivator, HosControllerActivator>());
var assembly = obj.GetType().GetTypeInfo().Assembly;
var manager = new ApplicationPartManager();
manager.ApplicationParts.Add(new AssemblyPart(assembly));
manager.FeatureProviders.Add(new ControllerFeatureProvider());
var feature = new ControllerFeature();
manager.PopulateFeature(feature);
feature.Controllers.Select(ti => ti.AsType()).ToList().ForEach(t =>
{
services.AddTransient(t);
});
}
在ConfigureServices中调用:
services.AddHosControllers(this);
到此,大功告成!可以愉快的继续CRUD了。
结尾
市面上好用的DI框架一堆一堆的,集成到Core里面也很简单,为啥还要这么折腾?没办法,这不就是造轮子的乐趣嘛。上面这些东西从头到尾也折腾了不少时间,属性注入那里也还有优化的空间,欢迎探讨。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。








