强类型Unity配置
本文关键字:配置 Unity 强类型 | 更新日期: 2023-09-27 18:02:41
我最近使用Unity作为IOC。虽然我并没有把它当作依赖注入器来使用,但我把它当作工厂来使用。
现在,在我的代码中,我使用以下代码来注册类型:
container.RegisterType<IFooInterface, FooClass>(
new[] { new InjectionProperty("SomeProperty", "SomeValue") });
是否有一种方法来使用强类型的属性注入?
你可以用一个流畅的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();
你得到类型安全,你可以继续添加propertyinjection,直到你调用Register。你也可以扩展这个类来注册任何其他你想要的unity注入工厂。