Как разрешить экземпляры с параметрами конструктора в пользовательском контейнере IOC? - PullRequest
0 голосов
/ 21 января 2009

Я пытаюсь построить свою собственную инверсию контейнера управления. Прямо сейчас я сохраняю объекты с их типами в словаре и разрешаю ссылку, когда их просят. Но я хочу сделать возможным разрешение ссылки или нового экземпляра. Я могу создать новый экземпляр с помощью класса Activator. Но что, если конструктор объекта для разрешения принимает 1, 2 или какие-либо параметры?

Например, я хочу сказать что-то вроде:

Container.register<IFoo>(new Foo(Proxy));
Container.register<IBar>(new Boo(Proxy, DataThing));

и разрешите как

IFoo MyFoo = Resolver.resolve<IFoo>();
IBar MyBar = Resolver.resolve<IBar>();

, где MyFoo создается с заданным параметром Proxy и MyBar с Proxy и DataThing .

Что должен решить , чтобы это произошло?

Ответы [ 3 ]

2 голосов
/ 07 марта 2009

Оформление заказа http://funq.codeplex.com. Это очень маленький контейнер, который использует лямбда-выражения для определения функции, которую нужно разрешить. Обрабатывает несколько параметров.

1 голос
/ 27 января 2009

Я решил разделить его на методы. Resolve, которое возвращает экземпляр, хранящийся в контейнере. И Create, который создает новый экземпляр.

что-то вроде:

 public T Create<T>()
         {
             if (registeredTypes.ContainsKey(typeof(T)))
                 return (T)Activator.CreateInstance(registeredTypes[typeof(T)].
                                                                       GetType());
             else
                 throw new DependencyResolverException("Can't
                                       create type. Type " + typeof(T) + "
                                                           not found.");
         }
0 голосов
/ 21 января 2009

Активатор может создать экземпляр класса, имеющий конструкторы с параметрами.

Посмотрите на эту перегрузку метода CreateInstance .

Вы можете предоставить пользовательский связыватель для поиска соответствующего конструктора вручную.

В вашем случае метод resol должен возвращать ссылку на экземпляр зарегистрированного класса (новый Boo (Proxy, DataThing) в вашем примере)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...