2014-05-11 57 views
0

我最近使用Unity作为IOC。虽然我没有真正将它用作依赖注入器,但我将它用作工厂。现在强类型的Unity配置

,在我的代码我使用下面的注册类型:

container.RegisterType<IFooInterface, FooClass>(
      new[] { new InjectionProperty("SomeProperty", "SomeValue") }); 

是否有使用强类型的属性注射的方法吗?

回答

3

你可以用流利的API来做到这一点。

public static class ContainerExtensions 
{ 

    public static InjectionBuilder<TFrom, TTo> BuildInjections<TFrom, TTo>(this IUnityContainer container) 
     where TTo : TFrom 
    { 
     return new InjectionBuilder<TFrom, TTo>(container); 
    } 

    public static MemberInfo GetMemberInfo(this Expression expression) 
    { 
     var lambda = (LambdaExpression)expression; 

     MemberExpression memberExpression; 
     if (lambda.Body is UnaryExpression) 
     { 
      var unaryExpression = (UnaryExpression)lambda.Body; 
      memberExpression = (MemberExpression)unaryExpression.Operand; 
     } 
     else 
      memberExpression = (MemberExpression)lambda.Body; 

     return memberExpression.Member; 
    } 
} 

// This class is the fluent API 
public class InjectionBuilder<TFrom, TTo> 
    where TTo : TFrom 
{ 
    private readonly IList<InjectionMember> _injectionMembers = new List<InjectionMember>(); 
    private readonly IUnityContainer _container; 
    public InjectionBuilder(IUnityContainer unityContainer) 
    { 
     _container = unityContainer; 
    } 

    public InjectionBuilder<TFrom, TTo> AddPropertyInjection<TType>(Expression<Func<TFrom, TType>> property, 
                    TType value) 
    { 
     var propName = property.GetMemberInfo().Name; 
     _injectionMembers.Add(new InjectionProperty(propName, value)); 
     return this; 
    } 

    public IUnityContainer Register() 
    { 
     return _container.RegisterType<TFrom, TTo>(_injectionMembers.ToArray()); 
    } 

} 

然后使用它像

 IUnityContainer container; // already Init 
     container.BuildInjections<IFooInterface, FooClass>() 
       .AddPropertyInjection(f => f.SomeProperty, "SomeValue") 
       .Register(); 

你得到的类型安全,你可以不断加入中PropertyInjections直到您调用注册。你也可以扩展这个类来注册你想要的任何其他统一注入工厂。

+0

不错!但实际上我希望这已经嵌入到Unity库中。你能证实它不是? – Stefan

+0

我没有办法知道。我们在工作中使用Unity,而且我从未碰过它。 – CharlesNRice