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

时间:2019-04-23 18:04:06

标签: c# .net dependency-injection

我有一个控制台应用程序,该应用程序通过构造函数注入所有服务。我还在数据访问类的构造函数中创建和初始化一个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方法时都会创建字典的新实例。

2 个答案:

答案 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。...但是您有多个线程可以同时调用此方法,并且如果您的Dictionarystatic,或者您使用的是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
}