【问题标题】:Unity alternative for Autofac TypedParameterAutofac TypedParameter 的 Unity 替代方案
【发布时间】:2017-08-13 09:06:36
【问题描述】:

小问题:如何实现与 Unity 中 Autofac 文档部分 Passing Parameters to Resolve 中描述的 TypedParameter 相同的功能?

一些背景知识:我们需要解析重命名基类的构造函数参数的继承类。该参数无法解析,必须传入。我们知道,继承的类只会有可解析的类型和一个基类构造函数参数。

亲切的问候, 杰夫

【问题讨论】:

  • Prevent injecting runtime data into your injection constructors。正如您已经注意到的那样,这会导致各种复杂情况。
  • @Steven 实际上,我今天早些时候在为我的真正问题寻找解决方案时碰巧读过你的帖子,但这并没有让我更接近一个好的解决方案。我的问题与我之前发布的另一个问题 stackoverflow.com/questions/42908224/… 有关,我认为将模型包装在 VM 中是一种很好的做法。我可以创建一个 INodeVMFactory 但我只是在解决相同的基本问题。我们可能会切换到另一个容器,但首先我们需要很好地解决这个问题。

标签: c# inversion-of-control unity-container autofac ioc-container


【解决方案1】:

您可以像这样创建自己的TypedParameter

internal class Program
{
    static void Main( string[] args )
    {
        var container = new UnityContainer();
        container.RegisterType<IInterface, Implementation>();

                    // this will be created with this MyLogger instance
        var instance = container.Resolve<IInterface>( new TypedParameter( typeof(ILogger), new MyLogger() ) );
    }
}

internal class TypedParameter : ResolverOverride
{
    private readonly Type _type;
    private readonly InjectionParameterValue _value;

    public TypedParameter( Type type, object value )
    {
        _type = type;
        _value = InjectionParameterValue.ToParameter( value );
    }

    public override IDependencyResolverPolicy GetResolver( IBuilderContext context, Type dependencyType )
    {
        ConstructorArgumentResolveOperation currentOperation = context.CurrentOperation as ConstructorArgumentResolveOperation;
        if ( currentOperation != null )
        {
            var parameter = currentOperation.TypeBeingConstructed.GetConstructors().Single().GetParameters().Single( x => x.Name == currentOperation.ParameterName );
            if (parameter.ParameterType == _type)
                return _value.GetResolverPolicy( dependencyType );
        }

        return null;
    }
}

// note that this is not registered with unity, is has to come from TypedParameter
internal class MyLogger : ILogger
{
}

internal interface ILogger
{
}

internal interface IInterface
{
}

internal class Implementation : IInterface
{
    public Implementation( ILogger logger )
    {
    }
}

尚未准备好生产,但如果构造的类型只有一个构造函数,它就可以工作。但是您必须小心,因为这些覆盖作用于在一个 Resolve 调用中创建的所有依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2015-03-03
    • 2015-09-25
    • 2019-12-16
    • 2011-06-20
    相关资源
    最近更新 更多