C# 类中未调用构造函数
我正在.NETCore2.2中创建一个助手,用于缓存到Redis中。当我调用Add方法时,它不会通过构造函数来创建C# 类中未调用构造函数,c#,asp.net-core,C#,Asp.net Core,我正在.NETCore2.2中创建一个助手,用于缓存到Redis中。当我调用Add方法时,它不会通过构造函数来创建IDistributedCache实例 public class Cache { public static IDistributedCache _cache; public Cache(IDistributedCache cache) { _cache = cache; } public static void Add(str
IDistributedCache
实例
public class Cache
{
public static IDistributedCache _cache;
public Cache(IDistributedCache cache)
{
_cache = cache;
}
public static void Add(string key, byte[] value, int expiration)
{
var options = new DistributedCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromSeconds(expiration));
_cache.Set(key, value, options);
}
}
我不太明白我到底错过了什么。我这样称呼这个方法
Cache.Add("time", encodedCurrentTimeUTC, expiration);
编辑:
我已经删除了静态条目
public class Cache
{
public IDistributedCache _cache;
public Cache(IDistributedCache cache)
{
_cache = cache;
}
public void Add(string key, byte[] value, int expiration)
{
var options = new DistributedCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromSeconds(expiration));
_cache.Set(key, value, options);
}
}
但是当我尝试调用该方法时
var newItem = new Cache();
newItem.Add("time", encodedCurrentTimeUTC, expiration);
它告诉我,我没有将参数传递到缓存构造函数中 由于您使用的是DI,请避免同时使用
new
。
让您的类缓存实现一个接口,例如:
public interface ICache
{
void Add(string key, byte[] value, int expiration);
}
public class Cache : ICache
{
public IDistributedCache _cache;
public Cache(IDistributedCache cache)
{
_cache = cache;
}
public void Add(string key, byte[] value, int expiration)
{
var options = new DistributedCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromSeconds(expiration));
_cache.Set(key, value, options);
}
}
在容器中注册Cache
为ICache
。例如:
依赖项注入框架将合成根目录中的所有内容连接在一起,例如ASP.NET中的Global.asax,并维护应用程序中对象的创建和生存期。由于您使用的是DI,请避免完全使用new
。
让您的类缓存实现一个接口,例如:
public interface ICache
{
void Add(string key, byte[] value, int expiration);
}
public class Cache : ICache
{
public IDistributedCache _cache;
public Cache(IDistributedCache cache)
{
_cache = cache;
}
public void Add(string key, byte[] value, int expiration)
{
var options = new DistributedCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromSeconds(expiration));
_cache.Set(key, value, options);
}
}
在容器中注册Cache
为ICache
。例如:
依赖项注入框架将合成根目录中的所有内容连接在一起,例如ASP.NET中的Global.asax,并维护应用程序中对象的创建和生存期。您的添加方法是静态的,所以我认为不会调用您的构造函数。您不是在调用新缓存
@User问题是静态构造函数不能包含参数-它们来自哪里?@User您真的确定静态构造函数是合适的吗?通常应避免使用静态类。最好使用这个类的一个实例,然后在IoC容器中注册一个实例。@用户好的,如果你想建议解决问题的方法,最好先考虑一下。如果您不确定这是一个好主意,请让其他人协助。您的Add
方法是静态的,所以我认为不会调用您的构造函数。您不是在调用新缓存
@User问题是静态构造函数不能包含参数-它们来自哪里?@User您真的确定静态构造函数是合适的吗?通常应避免使用静态类。最好使用这个类的一个实例,然后在IoC容器中注册一个实例。@用户好的,如果你想建议解决问题的方法,最好先考虑一下。如果你不确定这是个好主意,那就让其他人帮忙。@TheDizzle“避免使用new
”是个很好的建议。深入探讨为什么这是个好主意。完美的解决方案+1@TheDizzle“完全避免使用new
”是一个很好的建议。深入探讨为什么这是个好主意。完美解决方案+1
class ClassThatNeedsACache
{
ICache _cache;
ClassThatNeedsACache(ICache cache)
{
_cache = cache;
}
void MethodThatUsesACache()
{
// Some other code to create your encodedCurrentTimeUTC and expiration
_cache.Add("time", encodedCurrentTimeUTC, expiration);
}
}