Question

Je suis en train de créer un fournisseur d'appartenances personnalisé pour un site ASP.Net MVC. Le fournisseur est créé comme une catégorie distincte dans le cadre d'une plus grande bibliothèque. Il est nécessaire pour le magasin de données back-end pour être souple, car il pourrait être un fichier Xml ou base de données SQL. Mon idée initiale était de créer une interface pour le magasin de données et injecter dans le fournisseur en utilisant l'injection de dépendance.

Le résultat final est nécessaire est qu'un développeur peut hériter de l'interface de stockage de données et de fournir les méthodes nécessaires pour mettre à jour les données qui seront ensuite utilisées par les fournisseurs d'adhésion personnalisée.

Toutefois, grâce à mon manque de compétences, je ne peux pas comprendre comment injecter la classe dans le fournisseur d'appartenances lors de l'ajout au site? Que faut-il faire pour relier le magasin de données au fournisseur? Quelle serait la façon la plus simple d'activer ce dans le site?

Était-ce utile?

La solution

Si vous configurez les fournisseurs d'adhésion personnalisée via l'élément dans le fichier web.config, je peux voir les questions que vous aurez avec l'injection de dépendance.

Les fournisseurs sont construits et gérés par le cadre, et il n'y a aucune possibilité pour vous d'intercepter que la construction pour fournir l'injection de dépendance supplémentaire pour l'interface IDataStore.

Si mon hypothèse est correcte, alors ce que vous pouvez faire est de passer outre la méthode Initialize() dans votre fournisseur personnalisé, et faire l'injection de dépendance là-bas. Vous pouvez avoir un paramètre nom personnalisé / valeur dans la configuration du fournisseur qui pointe vers un type qui implémente IDataStore, qui est passé dans le cadre d'un dictionnaire à la méthode Initialize().

Ensuite, vous activez une instance du type de magasin de données et de définir sur la propriété appropriée:

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() sera appelé par le cadre après qu'il construit une instance de votre fournisseur, c'est donc l'endroit idéal pour faire un travail de configuration supplémentaire comme celui-ci.

Pour les scénarios de test, vous définissez simplement la propriété du magasin de données sur l'instance du fournisseur lui-même, comme vous le construirons directement dans vos tests.

Autres conseils

est-ce pas mieux? Je l'utilise avec MVC3 et ninject. Il suffit d'ajouter une propriété à votre classe de fournisseur d'appartenances personnalisé. Rappelez-vous d'ajouter « à l'aide System.Web.Mvc; » sur le dessus.

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

La façon la plus simple à faire l'injection de dépendance que je l'ai vu (et en fait la seule que je l'ai utilisé jusqu'à présent ...) est d'avoir un constructeur de votre classe dépendante prendre l'interface en tant que paramètre, et l'affecter à un champ privé. Si vous le souhaitez, vous pouvez également ajouter un constructeur « par défaut », qui chaînes à la première avec une valeur par défaut.

simplifié, il ressemblerait à quelque chose comme ceci:

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

Le concept est appelé « enchaînant constructeur », et il y a beaucoup d'articles sur le web sur la façon de le faire. Je trouve ce tutoriel très explicative du motif de DI.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top