autofac - 在解析构造函数参数时根据泛型类型设置属性值的配置

时间:2017-03-10 15:07:03

标签: c# generics autofac

我有一个定义如下的课程:

public class CommandBase<T>
{
    public string CommandText { get; set; }
}

public class CommandService : ICommandService
{
    public CommandService(CommandBase<SomeClass> command)
    {
        //some other code
    }
}

是否可以使用Autofac创建一个配置,以便当CommandService的构造函数参数为CommandBase<SomeClass>时,CommandText值为&#34; SomeCommand&#34;如果它的CommandBase<SomeOtherClass>CommandText值可以说&#34; SomeOtherCommand&#34;。

那么,简而言之,我可以在autofac中配置解析在构造函数参数中基于泛型类型解析的对象的属性值吗?

修改

命令文本的值是一个长查询字符串,来自另一个单例类。

2 个答案:

答案 0 :(得分:0)

一种解决方案是更改CommandBase实施

public class CommandBase<T>
{
    public CommandBase(CommandRetriever retriever)
    {
        this.CommandText = new Lazy<String>(() => retriever.GetCommand(typeof(T)); 
    }

    private readonly Lazy<String> _commandText; 

    public String CommandText { 
        get {
            return this._commandText.Value; 
        }
    }
}

顺便说一下,根据我的理解,我会做这样的事情:

public interface ICommand
{
    String CommandText { get; }
}

public abstract class CommandBase<T> : ICommand
{
    public CommandBase(CommandRetriever retriever)
    {
        this._commandText = new Lazy<String>(() => retriever.GetCommand(typeof(T)));
    }

    private readonly Lazy<String> _commandText;

    public virtual String CommandText => this._commandText.Value;
}

public class PersonCommand : CommandBase<Person>
{
    public PersonCommand(CommandRetriever retriever) : base(retriever)
    { }
}

这样你的CommandService不再是通用的,这简化了很多事情

public class CommandService : ICommandService
{
    public CommandService(ICommand command)
    {
        //some other code
    }
}

答案 1 :(得分:0)

答案是肯定的。您可以使用 RegisterGeneric

builder.RegisterGeneric(typeof(CommandBase<>)).AsSelf();

如果您想注册接口 -

builder.RegisterGeneric(typeof(CommandBase<>)).As(typeof(ICommandBase<>));