如何定义多个部分Owin Startup类并让它们全部运行代码

时间:2015-06-09 17:32:12

标签: asp.net asp.net-mvc asp.net-mvc-5 asp.net-identity owin

我正在开发一个具有“插件”架构的MVC应用程序。

基本上会有一个主“宿主”项目,它将在运行时动态加载其他项目。

我们希望将所有与ASP.NET身份相关的内容移动到自己独立的插件项目中。

主要宿主项目已经包含一个Owin Startup类,它有一些需要运行的逻辑。但是,我们还需要在Identity插件项目中创建一个Owin Startup类,以便我们可以调用ConfigureAuth()。

我该如何做到这一点?

MvcPluginHost.Web Startup.cs

[assembly: OwinStartupAttribute(typeof(MvcPluginHost.Web.Startup))]
namespace MvcPluginHost.Web
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}

MvcPluginHost.Plugins.IdentityPlugin Startup.cs

[assembly: OwinStartupAttribute(typeof(MvcPluginHost.Plugins.IdentityPlugin.Startup))]
namespace MvcPluginHost.Plugins.IdentityPlugin
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
        }
    }
}

1 个答案:

答案 0 :(得分:4)

部分类不适用于此,首先想到的是查询某些接口的所需程序集并在所有接口上调用公共方法。

var type = typeof(IMyInterface);
var types = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(s => s.GetTypes())
    .Where(p => type.IsAssignableFrom(p));

foreach(var implementation in types)
{
    var obj = (IMyInterface)Activator.CreateInstance(implementation);
    obj.RunPlugin() //Interface method you're trying to implement in partials
}