Zur Zeit habe ich ein paar dieser AnrufeAufrufen Generisches Erweiterung mit dynamisch generetad Lambda
app.CreatePerOwinContext<BasicUserManager>(BasicUserManager.Create);
app.CreatePerOwinContext<ADUserManager>(ADUserManager.Create);
...
Die „Create“ Methoden sind statisch Mitglieder jeder Klasse. Also im Grunde registriert es einen Handler, der aufgerufen wird, sobald ich ein BasicUserManager
Objekt von der owinContext
anfordere.
Und ich will es so, mit etwas ersetzen:
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => typeof(AbstractUserManager).IsAssignableFrom(p) && !p.IsAbstract);
foreach (var type in types)
{
app.RegisterUserManagers(type);
}
Kein Problem bisher. RegisterUserManagers
eine Erweiterung ist, die wie folgt definiert ist:
public static void RegisterSRTUserManager(this IAppBuilder app, Type type)
{
var createPerOwinContextMethod = typeof(AppBuilderExtensions).GetMethods().Where(p => p.Name == "CreatePerOwinContext" && p.GetParameters().Count() == 2).FirstOrDefault().MakeGenericMethod(type);
var createMethod = type.GetMethod("Create", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
var optionsType = typeof(IdentityFactoryOptions<>).MakeGenericType(type);
var delegateType = typeof(Func<,,>).MakeGenericType(optionsType, typeof(IOwinContext), type);
var body = Expression.Call(createMethod, Expression.Parameter(optionsType, "options"), Expression.Parameter(typeof(IOwinContext), "context"));
var func = Expression.Lambda(delegateType, body, Expression.Parameter(optionsType, "options"), Expression.Parameter(typeof(IOwinContext), "context")).Compile();
createPerOwinContextMethod.Invoke(null, new object[] {app, func });
}
Nach dem Lambda-Ausdruck kompilieren, erhalte ich eine Ausnahme:
Zusätzliche Informationen: Variable 'Optionen' des Typs ‚Microsoft.AspNet.Identity. Owin.IdentityFactoryOptions `1 [SeguridadAuth.Login.BD> .AdminOrgUserManager] 'referenziert vom Gültigkeitsbereich' ', ist jedoch nicht definiert.
Ich verstehe, dass params per Verweis hier übergeben werden sollte, aber ich bin nicht in der Lage, wie es in diesem Szenario zu tun ist.
Jede Hilfe wird wirklich geschätzt.