Я использую Единицу и Единицу. 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();
Метод 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();