[c#] Resolución de interfaz genérica con Autofac


0 Answers

Corrección. No puede llamar a MakeGenericType desde el contenedor. Resolví el problema de instanciar Genéricos usando el 'TIPO' como el parámetro en la llamada Resolver. El constructor está registrado.

        builder.RegisterGeneric(typeof (FakeRepository<>)).As(typeof (IRepository<>)).OnActivating(e =>
        {
            var typeToLookup = e.Parameters.FirstOrDefault() as TypedParameter;
            if (typeToLookup != null)
            {
                var respositoryType = typeof (FakeRepository<>);
                Type[] typeArgs = {typeToLookup.Value.GetType()};
                var genericType = respositoryType.MakeGenericType(typeArgs);
                var genericRepository = Activator.CreateInstance(genericType);
                e.ReplaceInstance(genericRepository);
            }
        });

Luego, la resolución sucede así, pasando un parámetro TypedParameter a la resolución. En este caso, tengo una lista de elementos (IItem) que están resueltos y quiero crear un repositorio para todos los elementos de ese tipo.

        var items = container.Resolve<IEnumerable<IItem<string>>>();
        foreach (var item in items)
        {
            var repository = container.Resolve(typeof (IRepository<DataItemBase>), new TypedParameter(item.GetType(), item));
            Assert.IsNotNull(repository);
        }

Gracias por su publicación, me ayudó y espero que esta actualización ayude.

Question

Dado el siguiente código, ¿cómo resuelvo la SomeInstance correcta en autofac?

public class BaseClass {}

public class SubClass1 : BaseClass {}

public class SubClass2 : BaseClass {}

public interface IGenericInterface<T> where T : BaseClass {}

public class SomeInstance1<T> : IGenericInterface<T> where T : SubClass1

public class SomeInstance2<T> : IGenericInterface<T> where T : SubClass2

Quiero elegir SomeInstance1 o 2 según el tipo de genérico en las subclases.

Así, por ejemplo, tengo una colección de subclases (SubClase1, 2 ...) y mientras estoy iterando sobre ellas quiero elegir la clase SomeInstance correcta.




Related



Tags

c# c#   autofac