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