2011-01-06 13 views
2

können Sie helfen mir bei meinem Problem:Anmeldung Modell für ASP.NET

i ASP.NET-Website, die einige grundlegende Autorisierungsfunktionen haben (Login/Logoout e.t.c.). Derzeit habe ich 3 Hauptmethoden:

  • Bool Login (String-Name, String-Passwort);
  • bool IsLogged();
  • Zeichenfolge GetUserID();

Alle diese Methoden sind "hardcoded" in einer Klasse. Login-Methoden überprüfen die Datenbank, um festzustellen, ob der Benutzer existiert. Aber dann habe ich beschlossen, XML-Dateien zum Speichern von Benutzern zu verwenden. Das bedeutet, dass die gesamte Logik, die einen Benutzer überprüft hat, neu geschrieben werden sollte.

Ich habe eine Idee, die folgende „Muster“ zu verwenden:

  1. erstellen Schnittstelle (zB ILoginProvider), die diese drei Methoden erklärt, die in jeder Klasse Implementieren Sie diese Schnittstelle über
  2. beschrieben und schreiben spezifische Logik in der Login() - Methode, um XML-Datei oder Datenbank zu überprüfen
  3. Übergeben Sie diese Klasse an ??? (Hier ist mein Problem)

Ich dachte, eine Klasse zu machen (zB Loginhelper), die ILoginProvider Schnittstelle als Argument nehmen:

class LoginHelper { 

    private static ILoginProvider provider; 

    // this method should be called somewhere in Application_Startup event in Global.asax 
    public static void RegisterLoginProvider(ILoginProvider inst) { 
     provider = inst; 
    } 
} 

und dann notwendige Methoden schreiben:

public static bool IsLogged() { 
    return provider.IsLogged(); 
} 

und rufen Sie dann die Methode RegisterLoginProvider() in Global.asax im Ereignis Application_Startup auf:

Ist es eine korrekte Art, eine solche Logik zu implementieren, um einige "Anbieter" mit anderen zu ändern?

+1

Normalerweise würden Sie das Provider-basierte Konfigurationsmodell verwenden, um Ihre Provider im Web zu definieren.config plus Auswahl welcher der Standard ist. Auf diese Weise werden SiteMapProvider, MemberShipProvider, RoleProviders usw. implementiert und es wird empfohlen, Defactor-Standards zu befolgen http://msdn.microsoft.com/en-us/library/system.configuration.provider.providerbase.aspx –

+1

Es ist eine gute Vorgehensweise Standards zu folgen, aber nicht notwendig, und außerdem, welche Implementierung zu gehen ist, liegt außerhalb des Bereichs dieser Frage. – CRice

Antwort

1

Die Methode wird oft über einen Service-Locator (Unity, StructureMap usw.) oder eine benutzerdefinierte Factory ausgeführt, in der Sie nach einer Instanz von ILoginProvider fragen und die richtige zurückgegeben wird.

Die Entscheidung, welche Art von ILoginProvider erstellt werden soll, liegt nicht an der aufrufenden Klasse.

//get a login provider from via a service locator 
ILoginProvider provider = DependencyLookup.Resolve<ILoginProvider>(); 

Mit dem Service-Locators, würden Sie gegen ILoginProvider registrieren, die Implementierung zu verwenden, entweder in XML-Konfiguration oder im Code. Hier ist ein Beispiel für Unity.

public static class ContainerConfiguration 
{ 
    public static void Configure() 
    { 
     ServiceLocator.Current.RegisterType<ILoginProvider, XmlLoginProvider>(); 
    } 
} 
+0

Aber wie finde ich heraus, welche Art von ILoginProvider ich verwenden soll? Vielleicht sollte ich einen Klassennamen in web.config speichern und dann auf folgende Weise an meine LoginHelper-Klasse übergeben: LoginHelper.RegisterLoginProvider (Activator.CreateInstance ("My_Class_Name_From_web.config))); IoC- und Abhängigkeits-Lookup sind für mein Verständnis schwierig. – Laserson

+0

All die harte Arbeit ist für Sie erledigt, wenn Sie einen der Service Locators verwenden. – CRice

+0

OK, es wird klarer. Aber was ist ServiceLocator? Ist es eine Klasse von Unity oder MS Enterprise Library oder einfach ein Beispiel? Danke – Laserson

1

Sie haben versucht, die Login-Funktionen zu abstrahieren, was sehr schön ist. Weiter müssen Sie diesen Helfer dazu bringen, die Seitenbindung über DependencyInjection durchzuführen, d. H. Sie müssen der Klasse ein Login mit LoginInterface als Argument hinzufügen. Dann können Sie mit Utilities wie StructureMap die Instanzen zur Laufzeit abrufen.

Durch die Schnittstellen können wir Anpassungsfähigkeit für zukünftige Fälle bieten, in denen Sie zu DB oder Webservice wechseln können.

Verwandte Themen