Используя Единицу, Как я авторегистрирую универсальный класс в универсальном интерфейсе, не регистрируя КАЖДЫЙ тип к нему

Я использую Единицу и Единицу. AutoRegistration. Эта строка для Единицы:

unityContainer.RegisterType(typeof(IAction<>), typeof(Action<>));

эффективно регистрирует каждый класс в проекте к IAction/Action:

unityContainer.RegisterType, Action>();
unityContainer.RegisterType, Action>();
unityContainer.RegisterType, Action>();
[...]
unityContainer.RegisterType, Action>();
[...]

Но, я только хочу, чтобы конкретные объекты были зарегистрированы. Как я сделал бы это? Мое предположение должно добавить декоратора пользовательского атрибута к определенным классам.

[ActionAtribute]
public class ObjectB
{ [...] }

И попытайтесь использовать Единицу. AutoRegistration. Это - то, где я упорно продолжен:

unityContainer.ConfigureAutoRegistration()
    .Include(If.DecoratedWith,
             Then.Register()
             .As   ?? // I'm guessing this is where I specify
             .With ?? // IAction goes to Action
             )
    .ApplyAutoRegistration();

6
задан Jaguir 12 February 2010 в 14:48
поделиться

1 ответ

Метод Include имеет перегрузку, которая позволяет передавать лямбда-выражение для регистрации вашего типа. Чтобы добиться именно того, что вы хотите с атрибутами, вы можете сделать следующее:

        unityContainer.ConfigureAutoRegistration()
            .Include(If.DecoratedWith<ActionAtribute>,
                     (t, c) => c.RegisterType(typeof(IAction<>).MakeGenericType(t), typeof(Action<>).MakeGenericType(t)))
            .IncludeAllLoadedAssemblies()
            .ApplyAutoRegistration();

Кроме того, первым аргументом метода Include является Predicate, поэтому, если вы хотите использовать не атрибуты, а какой-то другой механизм для определения того, какие типы включать или исключать, вы можете сделать это так:

        // You may be getting these types from your config or from somewhere else
        var allowedActions = new[] {typeof(ObjectB)}; 
        unityContainer.ConfigureAutoRegistration()
            .Include(t => allowedActions.Contains(t),
                     (t, c) => c.RegisterType(typeof(IAction<>).MakeGenericType(t), typeof(Action<>).MakeGenericType(t)))
            .IncludeAllLoadedAssemblies()
            .ApplyAutoRegistration();
6
ответ дан 17 December 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: