Frage

Ich bin im Begriff, einen benutzerdefinierten Mitgliedschaftsanbieter für eine ASP.Net MVC Website zu erstellen. Der Anbieter wird als eine separate Klasse, die als Teil einer größeren Bibliothek erstellt. Es besteht ein Bedarf für den Back-End-Datenspeicher flexibel zu sein, da es eine XML-Datei oder SQL-Datenbank sein könnte. Mein erster Gedanke war, eine Schnittstelle für den Datenspeicher und injiziert diese in Anbieter mit Dependency Injection zu erstellen.

Das Endergebnis erforderlich ist, ist, dass ein Entwickler den Datenspeicher-Schnittstelle erben können und die erforderlichen Methoden liefern die Daten zu aktualisieren, die dann von den benutzerdefinierten Mitgliedschaftsanbieter verwendet werden.

Doch durch meinen eigenen Mangel an Geschick kann ich nicht herausfinden, wie die Klasse in die Mitgliedschaftsanbieter zu injizieren, wenn es auf die Website hinzufügen? Was muss getan werden, den Datenspeicher an den Provider zu verknüpfen? Was wäre der einfachste Weg, dies in der Website zu aktivieren?

War es hilfreich?

Lösung

Wenn Sie die benutzerdefinierten Mitgliedschaftsanbieter über das -Element in der Datei Web.config konfigurieren, dann kann ich die Probleme sehen Sie mit Dependency Injection haben.

Die Anbieter sind so konstruiert und vom Framework verwaltet werden, und es gibt keine Möglichkeit für Sie abfangen, dass der Bau zusätzliche Dependency Injection für die IDataStore Schnittstelle zur Verfügung zu stellen.

Wenn meine Annahme richtig ist, dann, was Sie tun können, ist die Initialize() Methode in Ihrem benutzerdefinierten Anbieter zu überschreiben, und tut es die Dependency Injection. Sie können in der Provider-Konfiguration, die Punkte auf eine Art, die eine benutzerdefinierten Namen / Wert-Einstellung haben, dass Geräte IDataStore, die als Teil eines Wörterbuchs auf die Initialize() Methode übergeben wird.

Dann aktivieren Sie eine Instanz des Datenspeichertyp und legen Sie es auf die entsprechende Eigenschaft:

public class MyMembershipProvider : MembershipProvider
{
    public IDataStore DataStore
    {
        get;
        set;
    }

    public override Initialize(string name, NameValueCollection config)
    {
        var dataStoreType = config["dataStoreProvider"];
        if (!String.IsNullOrEmpty(dataStoreType))
        {
            var type = Type.GetType(dataStoreType);
            DataStore = (IDataStore) Activator.CreateInstance(type);
        }
    }
}

Initialize() wird vom Framework aufgerufen werden, nachdem es eine Instanz Ihres Providers konstruiert, so dass der perfekte Ort, um zusätzliche Einstellarbeiten, wie dies zu tun.

Für Szenarien zu testen, müssen Sie nur die Datenspeicher-Eigenschaft auf der Provider-Instanz festgelegt selbst, wie Sie es direkt in Ihren Tests konstruieren werden.

Andere Tipps

Ist das nicht besser das? Ich benutze es mit MVC3 und ninject. Es ist genug, um eine Immobilie zu Ihrer benutzerdefinierten Mitgliedschaftsanbieter Klasse hinzuzufügen. Denken Sie daran, hinzufügen „mit System.Web.Mvc;“ an der Spitze.

public IRepository Repository
{
    get
    {
        return DependencyResolver.Current.GetService<IRepository>();
    }
}

Der einfachste Weg, Dependency Injection zu tun, dass ich gesehen habe (und eigentlich die einzige, die ich habe bisher verwendeten ...) ist ein Konstruktor Ihrer abhängigen Klasse haben die Schnittstelle als Parameter, und ordnen Sie zu einem privaten Bereich. Wenn Sie möchten, können Sie auch einen „default“ Konstruktor, die Ketten auf den ersten mit einem Standardwert hinzuzufügen.

Vereinfachte, es wie folgt aussehen würde:

public class DependentClass
{
    private IDataStore _store;

    // Use this constructor when you want strict control of the implementation
    public DependentClass(IDataStore store)
    {
         this._store = store;
    }

    // Use this constructor when you don't want to create an IDataStore instance
    // manually every time you create a DependentClass instance
    public DependentClass() : this(new DefaultDataStore()) { }
}

Das Konzept „Konstruktorverkettung“ genannt, und es gibt eine Menge von Artikeln über das Internet, wie es zu tun. Ich finde dieses Tutorial sehr Erläuterung der DI-Muster.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top