单例注入和内存分配

时间:2018-03-06 15:56:45

标签: c# asp.net-mvc dependency-injection autofac constructor-injection

我有一个我想要遵循的设计,它由3层组成。模型,服务,数据。典型的服务/存储库看起来像这样:

public class ReadingService : IReadingService
{
    IReadingRepository readonly _readingRepository;
    IEnumerable<Reading> _myReadings;

    public ReadingService(IReadingRepository readingRepository)
    {
        _readingRepository = readingRepository;
    }

    public IEnumerable<Reading> GetMyReadings()
    {
        return _myReadings ?? (_myReadings =_readingRepository.GetMyReadings());
    }
}

public class ReadingRepository : IReadingRepository
{
    IMyCustomConnection readonly _connection;

    public ReadingRepository(IMyCustomConnection connection)
    {
        _connection = connection;
    }

    public IEnumerable<MyReading> GetMyReadings()
    {
        var query = @"Some Query";
        return _connection.Query(query);
    }
}

我将在需要时将这些类注入控制器。我将主要注入服务IReadingService。我遇到的问题实际上是绑定时使用范围的两难选择。如果我使用单例范围,那么我的延迟加载方法可以很好地工作。 (为了论证,假设_myReadings没有经常更新)。所以在这个例子中,我不想每次都查询数据库,因为我没有必要。

然而,另一部分是,我实际可以在内存中放多少。我真正想要做的是使每个服务和每个存储库类都成为一种单例类型。原因是我可以随时在我想要的任何东西上实现延迟加载。现在我明白我需要妥善处理IMyCustomConnection并且我已经这样做了,以便在单个请求中多次调用时不会导致问题。

我缺乏经验是犹豫的最大原因。将这样的大量类添加到单例范围好吗?我应该只在我需要的少数几个上做这个吗?他们消耗的内存比每次请求创建它们更有害吗?在考虑这种方法时,我还应该考虑其他任何事情吗?

可能很重要的一些附注: 我正在使用MVC 5,Dapper和Autofac。

0 个答案:

没有答案