试图提高MVC3 + Unity项目的效率

时间:2012-02-21 11:30:52

标签: asp.net-mvc-3 domain-driven-design unity-container

我有一个使用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项目更有效的任何想法,特别是在域模型设计中?

感谢阅读!

2 个答案:

答案 0 :(得分:1)

不应在域级别定义高速缓存,而应在存储库实现级别定义高速缓存(因此在DAL中)。因此,例如ICountryRepository应该在DAL中有两个实现: CountryRepository ChachedCountryRepository 。这些应该是Unity中的 连接为装饰器 CountryRepository位于ChachedCountryRepository内)。 CachedCountryRepository将检查数据是否在缓存中,如果不是,则会将调用传递给内部CountryRepository

创建对象并不昂贵,并且不会过多关注问题,因为缓存是正确定义的。

答案 1 :(得分:0)

很有道理。

但是,创建对象很便宜。我不会创建一个单例,因为你已经在静态字段中缓存所有对象。目前的方法很容易理解。

我还有另一个问题:

为什么不在存储库类中缓存?

存储库负责数据,所有数据处理应该对其他所有内容都是透明的。它还使一切变得更容易,因为它们负责更新数据源。如何让缓存与今天的更改保持同步?通过域名活动?

我会创建一个缓存类,我将其用作存储库中的私有字段。