我有一个定义如下的课程:
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中配置解析在构造函数参数中基于泛型类型解析的对象的属性值吗?
修改
命令文本的值是一个长查询字符串,来自另一个单例类。
答案 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<>));