我有一个我想要遵循的设计,它由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。