你可以用流利的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直到您调用注册。你也可以扩展这个类来注册你想要的任何其他统一注入工厂。
不错!但实际上我希望这已经嵌入到Unity库中。你能证实它不是? – Stefan
我没有办法知道。我们在工作中使用Unity,而且我从未碰过它。 – CharlesNRice