C# 类中未调用构造函数

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

我正在.NETCore2.2中创建一个助手,用于缓存到Redis中。当我调用Add方法时,它不会通过构造函数来创建
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);
    }
}