В настоящее время я работаю над абстракцией контейнера IoC, которая находится поверх StructureMap. Идея состоит в том, что он может работать и с другими контейнерами IoC.Передача аргументов методу, который должен использоваться для общего типа <T>?
public interface IRegister
{
IRegister RegisterType(Type serviceType, Type implementationType, params Argument[] arguments);
}
public abstract class ContainerBase : IRegister
{
public abstract IRegister RegisterType(Type serviceType, Type implementationType, params Argument[] arguments);
}
public class StructureMapContainer : ContainerBase
{
public StructureMapContainer(IContainer container)
{
Container = container;
}
public IContainer Container { get; private set; }
public override IRegister RegisterType(Type serviceType, Type implementationType, params Argument[] arguments)
{
// StructureMap specific code
Container.Configure(x =>
{
var instance = x.For(serviceType).Use(implementationType);
arguments.ForEach(a => instance.CtorDependency<string>(a.Name).Is(a.Value));
});
return this;
}
}
public class Argument
{
public Argument(string name, string value)
{
Name = name;
Value = value;
}
public string Name { get; private set; }
public string Value { get; private set; }
}
Я могу выполнить этот код, выполнив следующие действия:
//IContainer is a StructureMap type
IContainer container = new Container();
StructureMapContainer sm = new StructureMapContainer(container);
sm.RegisterType(typeof(IRepository), typeof(Repository));
Проблема возникает, когда я пытаюсь передать в качестве аргументов конструктора. StructureMap позволяет вам свободно перемещать все вызовы CtorDependency по своему желанию, но требует имени, значения и типа параметра конструктора. Так что я мог бы сделать что-то вроде этого:
sm.RegisterType(typeof(IRepository), typeof(Repository), new Argument("connectionString", "myConnection"), new Argument("timeOut", "360"));
Этот код работает как CtorDependency в настоящее время типа строки и оба аргумента являются строками, а также.
instance.CtorDependency<string>(a.Name).Is(a.Value)
Как передать несколько аргументов конструктора BUT любого типа этому методу? Является ли это возможным? Любая помощь приветствуется.
Вопрос: Почему вы не используете что-то вроде 'RegisterType (...)'? –
Femaref
У меня есть методы расширения, которые имеют эту подпись, но я решил включить только нужный код, чтобы проиллюстрировать проблему. – Thomas
Ах, правильно. Что касается вашего вопроса: я думаю, вы не сможете обойтись здесь, используя рефлексию, но это должно быть целесообразно использовать здесь. – Femaref