Asp.net MVC5+MEF插件场景下,运行时能否使用两个OWIN启动类?
关于多个OWIN Startup类的执行顺序问题解答
当然支持让主应用的Startup类优先运行,再执行插件里的专属OWIN启动逻辑——不过默认情况下OWIN只会自动检测并执行一个Startup类,所以我们需要手动控制这个流程,结合你用的MEF插件体系,刚好可以完美实现需求。
下面是具体的实现思路:
第一步:规范主应用与插件的Startup契约
先定义一个通用的接口,让插件的启动类都实现它,比如:public interface IPluginOwinStartup { void Configure(IAppBuilder app); }主应用的
main.dll里的Startup类保持正常(可以保留[OwinStartup]标记,确保它被OWIN自动检测到),而插件plugin.dll里的启动类不要加[OwinStartup],而是用MEF的导出标记,比如:[Export(typeof(IPluginOwinStartup))] public class PluginOwinStartup : IPluginOwinStartup { public void Configure(IAppBuilder app) { // 插件专属的OWIN配置逻辑,比如注册插件的路由、中间件等 } }第二步:在主应用Startup里手动触发插件启动逻辑
主应用的Startup类的Configuration方法是最先执行的,我们在完成主应用自身的OWIN配置后,通过MEF容器加载所有导出的IPluginOwinStartup实例,逐个调用它们的Configure方法。示例代码如下:[OwinStartup(typeof(Startup))] public class Startup { public void Configuration(IAppBuilder app) { // 主应用的核心OWIN配置,优先执行 ConfigureAuth(app); // 主应用的路由、其他中间件配置... // 从MEF容器获取所有插件的启动类实例 var pluginStartups = MefContainer.GetExports<IPluginOwinStartup>(); foreach (var startup in pluginStartups) { startup.Value.Configure(app); } } private void ConfigureAuth(IAppBuilder app) { // 主应用的认证配置逻辑 } }关键注意点
不要给插件的启动类加[OwinStartup]标记,否则OWIN可能会自动检测到它,导致启动顺序不可控;完全通过MEF手动加载执行,才能保证主应用先完成配置,插件再执行自己的专属逻辑。
另外,根据OWIN启动类检测的相关规则,默认只会挑选优先级最高的一个Startup类执行,但通过代码手动调用多个启动逻辑是官方允许且推荐的插件化场景实现方式,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Junior
相关产品推荐
相关产品推荐

