强类型Unity配置

本文关键字:配置 Unity 强类型 | 更新日期: 2023-09-27 18:02:41

我最近使用Unity作为IOC。虽然我并没有把它当作依赖注入器来使用,但我把它当作工厂来使用。

现在,在我的代码中,我使用以下代码来注册类型:

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

是否有一种方法来使用强类型的属性注入?

强类型Unity配置

你可以用一个流畅的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注入工厂。