Как да дефинирате множество частични класове за стартиране на Owin и всички те да изпълняват своя код

Работя върху MVC приложение, което ще включва архитектура на "плъгин".

По принцип ще има основен "хост" проект, който динамично ще зарежда други проекти по време на изпълнение.

Искаме да преместим всички неща, свързани с ASP.NET Identity, в собствен отделен проект за плъгини.

Основният хост проект вече съдържа клас Owin Startup, който има някаква логика, която трябва да стартира. Въпреки това, ние също трябва да създадем 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);
        }
    }
}

person thiag0    schedule 09.06.2015    source източник
comment
Не съм сигурен, че можете или искате да имате няколко Startup класа. Няма причина да не можете да имате отделна сглобка за идентичност, целта на класа Startup е да ви позволи да конфигурирате кои добавки искате да добавите. Без да знам вашите специфични изисквания и текущия ви подход, бих се обзаложил, че всъщност трябва да сменяте добавките за удостоверяване, като използвате конфигурацията.   -  person mclark1129    schedule 09.06.2015
comment
@MikeC Благодаря за отговора. Не се опитвам да изключа добавките за удостоверяване, основно се опитвам да стартирам стартовия код на Owin от различни места. Основното хост приложение не знае за приставката за самоличност по време на компилиране, така че не мога да конфигурирам удостоверяване на owin от там. Също така не може да се направи класът за стартиране по подразбиране да бъде този в приставката за самоличност, тъй като основното хост приложение трябва да настрои SignalR, което не се изисква от приставката за самоличност.   -  person thiag0    schedule 09.06.2015


Отговори (1)


Частичните класове не са предназначени за това, първото нещо, което идва на ум е да заявите желаните сборки за някакъв интерфейс и да извикате общ метод за всички тях.

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
}
person bateloche    schedule 09.06.2015
comment
Това би бил маршрутът, по който трябва да се върви според мен. Задайте класа на главния хост Startup да поддържа динамични модули на добавки. IMyInterface може да има и метод Configure(IAppBuilder app), така че можете просто да предадете приложението на всеки сбор. - person mclark1129; 09.06.2015
comment
Благодаря, момчета, имах предвид този вариант, но се надявах да има по-чист начин. Успях да внедря вашето решение и то работи според очакванията, благодаря отново! - person thiag0; 09.06.2015
comment
По-чист начин би бил да използвате някакъв контейнер за инжектиране на зависимости, който да ви позволи да конфигурирате дали ще бъдат извикани добавки и прозрачно да вършите работата по отразяване. - person bateloche; 09.06.2015
comment
@bateloche Тук възможен сценарий, който няма да бъде обхванат, е, че ConfigureAuth() е метод на Partial class Startup. В този случай горното решение няма да бъде пълното решение. - person vendettamit; 09.06.2015
comment
@vendettamit Не знам дали разбрах какво имахте предвид, но всяка реализация на интерфейса, който използвахме, е свободна да извиква каквото е необходимо за извършване на работата, стига методът да е в обхвата на извикващия (референтни сборки) няма да има значение. - person bateloche; 09.06.2015
comment
Да, абсолютно си прав, но тук ситуацията е малко трудна. Методът в една от реализациите се намира в класа Partial, което би направило този сценарий малко труден за работа. Погледнете ConfigureAuth(), неговата дефиниция е част от друг частичен клас за стартиране, който се намира в сборката на Owin Identity. Надявам се, че ме разбрахте. - person vendettamit; 10.06.2015
comment
О... Разбрах, но смисълът е същият, този метод ще трябва да бъде преработен някъде другаде. Но както и да е, хубав улов, нямаше да видя това, ако не... - person bateloche; 10.06.2015
comment
Трябва да премахне самия IMyInterface от колекцията типове, в противен случай кодът тук се опитва да създаде екземпляр на самия интерфейс. FYI. - person Sean Sherman; 09.10.2018