我有一个使用Unity进行依赖注入的MVC3项目。
有一个主要的MVC3项目,一个位于MVC3和数据层之间的“域”类库,以及构成数据层的一堆类库。
(MVC3) - (域名) - (数据层)
这是域类中一个服务构造函数的示例:
public DomainModelCacheServices(
Data.Interface.ICountryRepository countryRepository,
Data.Interface.ILanguageRepository languageRepository,
Data.Interface.ISocialNetRepository socialNetRepository
)
每次调用在其构造函数中具有DomainModelCacheServices的控制器时,都会构造一个新的DomainModelCacheServices对象,以及DomainModelCacheServices的构造函数中的三个存储库类。
我无法相信这是有效的!
更糟糕的是,DomainModelCacheServices类是一个缓存类。它加载永不改变的数据列表,并将它们保存为静态。但它仍然需要为每个引用构建三个存储库类!
如果我给DomainModelCacheServices一个单身的生命周期(永远),我必须确保它是线程安全的,如果有一天我得到数百次点击,那么就会有很多锁定。
我可以将构造函数更改为:
public DomainModelCacheServices(
IServiceLocator serviceLocator
)
我不知道为什么,但这看起来不对。构造函数变得毫无意义,我必须在域类中引用Unity,并以某种方式使域类知道MVC3应用程序拥有的ServiceLocator。松散耦合可能太宽松了吗?
也许构建所有这些类并不像它看起来那么低效我不应该担心它?
如果Unity支持“Lazy”构造函数参数,那会更好。但事实并非如此。
那么,关于如何使MVC3 + Unity项目更有效的任何想法,特别是在域模型设计中?
感谢阅读!
答案 0 :(得分:1)
不应在域级别定义高速缓存,而应在存储库实现级别定义高速缓存(因此在DAL中)。因此,例如ICountryRepository
应该在DAL中有两个实现: CountryRepository 和 ChachedCountryRepository 。这些应该是Unity中的 连接为装饰器 (CountryRepository
位于ChachedCountryRepository
内)。 CachedCountryRepository
将检查数据是否在缓存中,如果不是,则会将调用传递给内部CountryRepository
。
创建对象并不昂贵,并且不会过多关注问题,因为缓存是正确定义的。
答案 1 :(得分:0)
很有道理。
但是,创建对象很便宜。我不会创建一个单例,因为你已经在静态字段中缓存所有对象。目前的方法很容易理解。
我还有另一个问题:
为什么不在存储库类中缓存?
存储库负责数据,所有数据处理应该对其他所有内容都是透明的。它还使一切变得更容易,因为它们负责更新数据源。如何让缓存与今天的更改保持同步?通过域名活动?
我会创建一个缓存类,我将其用作存储库中的私有字段。