Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在调用方法时创建类的新实例_C#_.net_Dependency Injection - Fatal编程技术网

C# 在调用方法时创建类的新实例

C# 在调用方法时创建类的新实例,c#,.net,dependency-injection,C#,.net,Dependency Injection,我有一个控制台应用程序,它通过构造函数注入所有服务。我还在数据访问类的构造函数中创建和初始化字典 我正在从我的主类调用数据访问方法,但我想创建一个数据访问类的新实例,因此每当我调用方法GetData()时,都要创建字典 数据访问接口 公共接口IMyServiceDataAccess { List GetData(); } 数据访问类: Dictionary<bool,List<int> dict; public MyServiceDataAccess() { dict

我有一个控制台应用程序,它通过构造函数注入所有服务。我还在数据访问类的构造函数中创建和初始化字典

我正在从我的主类调用数据访问方法,但我想创建一个数据访问类的新实例,因此每当我调用方法GetData()时,都要创建字典

数据访问接口

公共接口IMyServiceDataAccess { List GetData(); }

数据访问类:

Dictionary<bool,List<int> dict;
public MyServiceDataAccess()
{
    dict = new Dictionary<bool,List<int>>()
}

public List<int> GetData()
{
    // have to access the above dict and everytime I need new instance 
    // of this dict
}

Dictionary既然您提到希望共享
Dictionary
对象,我假设您不打算将
MyServiceDataAccess
作为临时对象注入。在对象
上创建dictionary static
,或者将其作为下面的
单例注入

private static void ConfigureServices(IServiceCollection serviceCollection)
{
    serviceCollection.AddTransient<IMyServiceDataAccess, MyServiceDataAccess>();
    serviceCollection.AddSingleton<MyService>();
}
私有静态void配置服务(IServiceCollection serviceCollection)
{
serviceCollection.AddTransient();
serviceCollection.AddSingleton();
}
您是否应该这样做取决于您的数据层,例如

此时,您可以更新
GetData
方法,以在其方法调用中重新初始化
词典。。。。但是您有多个线程可以同时调用此方法,如果您的
字典
静态的
或者您使用的是
单例
,那么您将遇到修改
字典
并尝试在不同线程之间使用它的问题。您可能希望改用线程安全的。但是,如果每次调用都要初始化字典,为什么要跨线程共享它呢?实现您要求的解决方案的唯一答案要么是不可靠的
词典
,要么是您必须先关闭
GetData
调用并否定共享
词典
中的任何一点


我对这个答案做了一些假设,因为你没有清楚地描述你遇到的问题,只是你正在寻找的解决方案的细节,这个解决方案很容易实现,但逻辑上有很多问题。这个答案的目的是突出这些问题,并希望引导您朝着更好的方向前进。

我没有回答实际的问题,但我假设您在问,如何在不每次连接外部数据库的情况下缓存相同的数据

您可以使用ObjectCache来实现这一点。例如:

private ObjectCache cache = MemoryCache.Default;

public MyServiceDataAccess()
{

}

public List<int> GetData()
{
    string data = cache["someKey"] as List<int>;

    if (data == null)
    {
        //fetch the actual data
        data = GetMyData();
        cache.Set("someKey", data);
    }

    return data
}
private ObjectCache cache=MemoryCache.Default;
公共MyServiceDataAccess()
{
}
公共列表GetData()
{
字符串数据=缓存[“someKey”]作为列表;
如果(数据==null)
{
//获取实际数据
data=GetMyData();
Set(“someKey”,数据);
}
返回数据
}

GetData()中只需要一个变量时,为什么要使用字段?您是否在任何其他方法中使用
dict
?您在
AddTransient
中注册服务的方式将阻止您的词典被共享。每当一个线程请求一个
MyServiceDataAccess
的实例时,它都会得到一个类的新实例,该实例有自己的
Dictionary
对象的副本。什么?这是一个X-Y问题,您假设“一种方法是每次调用它时,我都在get data方法中创建新的dictionary实例。”可能不需要对dictionary做任何事情,您只需要在GetData中调用ToArray,因此Int列表不会附加到dictionary
private static void ConfigureServices(IServiceCollection serviceCollection)
{
    serviceCollection.AddTransient<IMyServiceDataAccess, MyServiceDataAccess>();
    serviceCollection.AddSingleton<MyService>();
}
private ObjectCache cache = MemoryCache.Default;

public MyServiceDataAccess()
{

}

public List<int> GetData()
{
    string data = cache["someKey"] as List<int>;

    if (data == null)
    {
        //fetch the actual data
        data = GetMyData();
        cache.Set("someKey", data);
    }

    return data
}