代码之家  ›  专栏  ›  技术社区  ›  Jaguir

使用Unity,如何使用泛型接口自动注册泛型类,而不向其注册所有类型

  •  6
  • Jaguir  · 技术社区  · 16 年前

    我用的是团结和团结 Unity.AutoRegistration

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

    有效地将项目中的每个类注册到IAAction/Action:

    unityContainer.RegisterType<IAction<ObjectA>, Action<ObjectA>>();
    unityContainer.RegisterType<IAction<ObjectB>, Action<ObjectB>>();
    unityContainer.RegisterType<IAction<ObjectC>, Action<ObjectC>>();
    [...]
    unityContainer.RegisterType<IAction<UnrelatedObject>, Action<UnrelatedObject>>();
    [...]
    

    但是,我只希望注册特定的对象。我该怎么做?我的猜测是向特定类添加自定义属性装饰器。

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

    并尝试使用 统一自动注册 . 这就是我所处的困境:

    unityContainer.ConfigureAutoRegistration()
        .Include(If.DecoratedWith<ActionAtribute>,
                 Then.Register()
                 .As   ?? // I'm guessing this is where I specify
                 .With ?? // IAction<match> goes to Action<match>
                 )
        .ApplyAutoRegistration();
    
    1 回复  |  直到 16 年前
        1
  •  6
  •   Artem Govorov    16 年前

    Include方法具有重载,允许您传递lambda以注册类型。要使用属性实现您想要的效果,可以执行以下操作:

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

    另外,Include方法的第一个参数是谓词,所以如果您不想使用属性而是其他机制来定义要包含或排除的类型,可以这样做:

            // 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();