Domanda

Io sono nel processo di creazione di un provider di appartenenze personalizzato per un sito web ASP.Net MVC. Il provider è stato creato come una classe separata come parte di una biblioteca più grande. V'è la necessità per l'archivio dati di back-end per essere flessibile come potrebbe essere un file XML o database SQL. Il mio primo pensiero è stato quello di creare un'interfaccia per l'archivio dati e iniettare questo in provider mediante l'iniezione di dipendenza.

Il risultato finale è richiesto è che uno sviluppatore può ereditare l'interfaccia archivio di dati e di fornire i metodi necessari per aggiornare i dati, che verranno poi utilizzati dai provider di appartenenze personalizzato.

Tuttavia attraverso la mia mancanza di abilità non riesco a capire come iniettare la classe nel provider di appartenenze quando si aggiunge al sito web? Che cosa deve essere fatto per collegare l'archivio dati al fornitore? Quale sarebbe il modo più semplice per attivare questo nel sito?

È stato utile?

Soluzione

Se si sta configurando i provider di appartenenze personalizzato tramite l'elemento nel file web.config, quindi posso vedere i problemi che si avrà con l'iniezione di dipendenza.

I fornitori sono costruiti e gestiti dal framework, e non v'è alcuna possibilità per voi di intercettare che la costruzione di fornire l'iniezione aggiuntiva di dipendenza per l'interfaccia IDataStore.

Se la mia ipotesi è corretta, allora che cosa si può fare è l'override del metodo Initialize() nel vostro provider personalizzato, e fare l'iniezione di dipendenza lì. Si può avere un'impostazione nome personalizzato / valore nella configurazione del provider, che fa riferimento a un tipo che implementa IDataStore, che viene passato come parte di un dizionario per il metodo Initialize().

Poi, si attiva un'istanza del tipo di archivio dati e imposta sulla proprietà appropriata:

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() sarà chiamato dal framework dopo che costruisce un'istanza del provider, in modo che sia il luogo ideale per fare qualsiasi lavoro configurazione aggiuntiva come questa.

Per gli scenari di test, è sufficiente impostare la proprietà archivio dati sull'istanza fornitore stesso, come si sarà costruendo direttamente nel tuo test.

Altri suggerimenti

Non è questo meglio? Io lo uso con MVC3 e Ninject. E 'sufficiente aggiungere un alloggio ai vostra abitudine di classe provider di appartenenza. Ricordarsi di aggiungere "usando System.Web.Mvc;" sulla parte superiore.

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

Il modo più semplice per fare l'iniezione di dipendenza che ho visto (e in realtà l'unico che ho usato finora ...) è di avere una costruzione della classe di dipendenti prendere l'interfaccia come parametro, e assegnarlo ad un campo privato. Se si desidera, è anche possibile aggiungere un costruttore di "default", che catene per il primo con un valore di default.

semplificata, sarebbe simile a questa:

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()) { }
}

Il concetto è chiamato "Costruttore concatenamento", e c'è un sacco di articoli sul web su come farlo. Trovo questo tutorial molto esplicativa del modello DI.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top