是否可以在运行时使用两个不同的Owin启动文件?

时间:2018-02-21 22:11:39

标签: c# asp.net-mvc asp.net-mvc-5 owin mef

我正在使用带有MEF framework的Asp.net MVC 5应用程序,允许我将MVC应用程序设计为主应用程序中的插件。

我需要一个我的插件之一需要拥有自己的OwinStart up类,该类在属于我的主应用程序的主Owin类之后运行。

换句话说,main.dllStartup类,它总是需要先运行,然后plugin.dll有一个Startup类,需要运行第二个。

是否可以拥有2个自己的启动类?

Docs about detecting StartUp类

  

OwinStartup属性会覆盖命名约定。您可以   也可以使用a指定具有此属性的友好名称   友好名称要求您也使用中的appSetting元素   配置文件。

所以我尝试添加一个像这样的友好名称

[assembly: OwinStartup("pluginStartup", typeof(plugin.Startup))]

在配置文件中添加了以下内容

<appSettings>  
  <add key="owin:appStartup" value="Main.Startup, Main" />
</appSettings>

但是这不会归档我的Plugin.Startup只会运行Main.Startup

有没有办法运行两个不同的Startup类?

https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-startup-class-detection

1 个答案:

答案 0 :(得分:2)

似乎无法运行多个启动文件。

但是,我用反射来完成工作。基本上,我搜索实现IAppConfiguration接口的任何类的所有程序集,然后在该实例上调用Configuration

我是这样做的。

我创建了一个界面

public interface IAppConfiguration
{
    void Configuration(IAppBuilder app);
}

然后在我的main.dll中,我将以下代码添加到我的Startup课程中。

    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
        ConfigurePlugins(app);
    }

    private static void ConfigurePlugins(IAppBuilder app)
    {
        try
        {
            foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
            {
                var startups = assembly.GetTypes().Where(x => x.IsClass && typeof(IAppConfiguration ).IsAssignableFrom(x)).ToList();

                foreach (Type startup in startups)
                {
                    var config = (IAppConfiguration )Activator.CreateInstance(startup);

                    config.Configuration(app);
                }
            }
        }
        catch
        {

        }
    }