Pregunta

Estoy en el proceso de creación de un proveedor de suscripciones personalizado para un sitio web ASP.Net MVC. El proveedor está siendo creado como una clase separada como parte de una biblioteca más grande. Hay una necesidad de que el almacén de datos de back-end a ser flexible ya que podría ser un archivo XML o base de datos SQL. Mi idea inicial era crear una interfaz para el almacén de datos e inyectar en este proveedor de usar la inyección de dependencia.

Se requiere que el resultado final es que un desarrollador puede heredar la interfaz de almacenamiento de datos y proporcionar los métodos necesarios para actualizar los datos, que luego serán utilizados por los proveedores de suscripciones personalizado.

Sin embargo a través de mi propia falta de habilidad que no puedo encontrar la manera de inyectar la clase en el proveedor de pertenencia al agregarla a la página web? Lo que hay que hacer para vincular el almacén de datos al proveedor? ¿Cuál sería la forma más sencilla para habilitar esta en el sitio web?

¿Fue útil?

Solución

Si está configurando los proveedores de pertenencia personalizada a través del elemento en el archivo Web.config, entonces puedo ver los problemas que tendrá con la inyección de dependencia.

Los proveedores están construidos y gestionados por el marco, y no hay oportunidad para que intercepte que la construcción para proporcionar la inyección de dependencia adicional para la interfaz IDataStore.

Si mi hipótesis es correcta, entonces lo que puede hacer es reemplazar el método Initialize() en su proveedor personalizado, y hacer la inyección de dependencias allí. Puede tener una configuración conocida de encargo / valor en la configuración del proveedor que apunta a un tipo que implementa IDataStore, que se transmite como parte de un diccionario para el método Initialize().

A continuación, se activa una instancia del tipo de almacén de datos y la puso sobre la propiedad adecuada:

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() será llamado por el marco después de que se construye una instancia de su proveedor, por lo que es el lugar perfecto para hacer ningún trabajo adicional sobre la instalación de este tipo.

Para los escenarios de prueba, que acaba de establecer la propiedad de almacenamiento de datos en la misma instancia de proveedor, ya que estará construyendo directamente en sus pruebas.

Otros consejos

No es esto mejor? Yo lo uso con MVC3 y ninject. Es suficiente para añadir una propiedad a su clase de proveedor de suscripciones personalizado. Recuerde agregar "usando System.Web.Mvc;" en la parte superior.

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

La forma más simple de hacer la inyección de dependencias que he visto (y de hecho el único que he usado hasta ahora ...) es tener un constructor de la clase depende de tener la interfaz como parámetro, y asignarle a un campo privado. Si lo desea, también puede agregar un constructor "por defecto", que encadena a la primera con un valor por defecto.

simplificado, se vería algo como esto:

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

El concepto se llama "Constructor de encadenamiento", y hay una gran cantidad de artículos en la web sobre la manera de hacerlo. Encuentro este tutorial muy explicativo del patrón de DI.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top