我有一个控制台应用程序,该应用程序通过构造函数注入所有服务。我还在数据访问类的构造函数中创建和初始化一个Dictionary。
我正在从主类中调用数据访问方法,但我想在每次调用方法GetData()时创建一个数据访问类的新实例,并因此创建一个字典。
public class Startup
{
private static void Main(string[] args)
{
ServiceCollection serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
serviceProvider.GetService<MyService>().Start();
}
private static void ConfigureServices(IServiceCollection serviceCollection)
{
serviceCollection.AddTransient<IMyServiceDataAccess, MyServiceDataAccess>();
serviceCollection.AddTransient<MyService>();
}
}
MyServiceClass:
private readonly IMyServiceDataAccess _dataAccess;
public MyService(IMyServiceDataAccess dataAccess)
{
_dataAccess = dataAccess;
}
public void Start()
{
var data = _dataAccess.GetData();
}
DataAccess界面
公共接口IMyServiceDataAccess { 列出GetData(); }
DataAccess类:
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
}
这是一个多线程应用程序,因此多个线程可以共享字典。一种方法是每次调用get data方法时都会创建字典的新实例。
答案 0 :(得分:0)
由于您提到要共享Dictionary<bool, List<int>>
对象,因此我假设您不打算将MyServiceDataAccess
注入为临时对象。在对象static
上制作字典,或将其作为Singleton
插入下面。
private static void ConfigureServices(IServiceCollection serviceCollection)
{
serviceCollection.AddTransient<IMyServiceDataAccess, MyServiceDataAccess>();
serviceCollection.AddSingleton<MyService>();
}
是否应该执行此操作取决于您的数据层,例如EntityFramework Core recommends to inject DbContexts with a Scoped lifetime。
那时,您可以更新GetData
方法以在其方法调用中重新初始化Dictionary
。...但是您有多个线程可以同时调用此方法,并且如果您的Dictionary
是static
,或者您使用的是Singleton
,则在修改Dictionary
并尝试在不同线程中使用它会遇到问题。您可能想使用ConcurrentDictionary,它是线程安全的。但是,如果无论如何每次调用都要重新初始化它,为什么要在线程之间共享此Dictionary
?唯一可以实现您所要求的解决方案的答案要么是一个不可靠的Dictionary
,要么是您必须关闭GetData
呼叫,并否定共享Dictionary
的任何要点
我对这个答案做了一些假设,因为您并没有清楚地描述您所遇到的问题,只是您正在寻找的解决方案的细节很容易实现,但是在逻辑上存在很多问题。该答案的目的是突出这些问题,并希望可以引导您朝着更好的方向发展。
答案 1 :(得分:0)
我没有找到实际的问题,但是我想您是在问如何缓存相同的数据,而不必每次都连接到外部数据库。
您可以为此使用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
}