2010-02-11 160 views
6

我正在使用Unity和Unity.AutoRegistration。该行统一:使用Unity,如何使用通用接口自动注册泛型类,而无需注册每种类型

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

在项目IAction /行动有效注册的每个类:

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 
{ [...] } 

并尝试使用Unity.AutoRegistration。这是我卡在的地方:

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

回答

6

包含方法有重载,允许您传递lambda来注册您的类型。为了实现准确,你可以做你想做的与属性是这样的:

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

而且,第一个参数包括方法是谓语,所以如果你不想使用属性,但其他一些机制来定义哪些类型包括或排除,你可以这样做:

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

这正是我所需要的!谢谢你的例子。 – Jaguir 2010-02-15 23:17:20

+0

我不认为在使用Unity 2.0的配置中有这样的方法吗? – 2011-02-16 19:33:23

相关问题