Регистрация типа Funq ServiceStack через отражение?

Я использовал Castle Windsor совсем немного. У него есть действительно удобное средство для регистрации типов через отражение. Так, например, я бы делал такие вещи при запуске приложения:

container.Register(Classes.FromThisAssembly().BasedOn<IMyInterface>().LifestyleTransient());

Итак, скажем, у меня была куча провайдеров для форматирования данных — я мог зарегистрировать их всех (через интерфейс) одной строкой. Еще лучше, когда я создавал новые (при условии, что они были в той же сборке и с тем же интерфейсом), они также регистрировались; Мне не нужно было бы помнить об этом при их кодировании.

Есть ли эквивалент контейнера Funq в реализации ServiceStack? Я огляделся и, кажется, не вижу никого.


person StratMN    schedule 14.02.2018    source источник


Ответы (1)


Интерфейс может иметь только одну реализацию, но если вы хотите зарегистрировать все конкретные типы, реализующие интерфейс, просканировав все типы и предварительно зарегистрировав их с помощью:

var fooTypes = assembly.GetTypes().Where(x => x.HasInterface(typeof(IFoo)));
container.RegisterAutoWiredTypes(fooTypes);

Что при необходимости можно получить с помощью:

 var fooInstances = fooTypes.Select(c.Resolve).Cast<IFoo>();

Который также может быть зарегистрирован как сама зависимость:

container.Register(c => fooTypes.Select(c.Resolve).Cast<IFoo>()); 

К которым ваши классы могут получить доступ с помощью внедрения свойств:

public IEnumerable<IFoo> FooInstances { get; set; }
person mythz    schedule 14.02.2018