例如,我有这样的课程
public class ABC
{
private readonly IMemoryCache _cache;
private readonly IConfiguration _config;
private readonly IDistributedCache _distributedCache;
public ABC(IMemoryCache memoryCache, IConfiguration config, IDistributedCache distributedCache)
{
_cache = memoryCache;
_config = config;
_distributedCache = distributedCache;
}
public ABC() : this(IMemoryCache , IConfiguration ,IDistributedCache )
{
}
}
如您所见,我已经尝试从无参数构造函数中调用参数化构造函数,但这是不可能的。还有其他方法可以实现这个概念吗?
答案 0 :(得分:2)
您需要传入这些接口的concrete implementations,就像调用方法一样。除了this()
语法外,没有什么其他魔术。例如,如果您在类IMemoryCache
中实现了DefaultMemoryCache
的默认实现,则可以“重新设置”并将其传递给:
public ABC() : this(new DefaultMemoryCache(), etc.)
{
}
或者,如果构造这些依赖项有点太复杂,则可以使用静态factory method:
public static ABC CreateNew()
{
var others = ...
var cache = new DefaultCache(others, etc.)
...
return new ABC(cache, etc.);
}
但是,如果您希望能够使用该界面作为输入,则可以执行以下操作:(现在,这只是一个例子,我不建议您这样做,因为这样做会变得非常混乱和脆弱)
public ABC() : this
(
(IMemoryCache) Activator.CreateInstance
(
Assembly.GetExecutingAssembly().GetTypes().First
(
t => typeof(IMemoryCache).IsAssignableFrom(t) && !t.IsInterface
)
)
)
{
}
上面的reflection代码段实质上是dependency injection library的功能,如果您的项目适合,您可能要考虑使用一个。
最后一件事,只是为了获得完整的答案,当然,您也可以在overloaded contractors中实现主体:
public class ABC
{
private readonly ICache _cache;
public ABC()
{
_cache = new Cache();
}
public ABC(ICache cache)
{
_cache = cache;
}
}
: this()
语法仅在您要调用同一类中的其他构造函数以重复使用代码时才需要。
答案 1 :(得分:1)
使用实例而不是类型。创建所有满足您接口要求的类的实例。
public class ABC
{
private readonly IMemoryCache _cache;
private readonly IConfiguration _config;
private readonly IDistributedCache _distributedCache;
public ABC(IMemoryCache memoryCache, IConfiguration config, IDistributedCache distributedCache)
{
_cache = memoryCache;
_config = config;
_distributedCache = distributedCache;
}
public ABC() : this(new MemoryCache(), new Configuration(), new DistributedCache() )
{
}
}