2011-06-03 44 views
2

我有一个IRepository接口,包含许多T和几个实现(按需数据库,Web服务等)。我使用AutoFac来为许多T注册IRepository,具体取决于每个T需要的存储库种类。用一个标记替换存储库

我也有一个基于.NET缓存的实现,它在缓存中查找T,然后调用一个'真正的'IRepository寻找解决缓存遗漏的方法。它的构造是这样的:“真正的东西”

new CachingRepository(realRepository, cacheImplementation); 

我想用一个配置标志,以决定是否AutoFac提供了缓存,基于IRepository的或看起来像'realRepository'来自AutoFac来解决IRepository < T>,但是当客户要求解析相同的接口时,客户会得到什么?如果标志被设置,我希望他们获得CachingRepository。

我无法理解如何实现这种基于标志的解决方案。有任何想法吗?

+0

您也可以考虑将缓存作为一个方面来实现,只有启用了缓存后,才能通过AutoFac将其附加到“realRepository”。可能会减少您必须维护的与缓存相关的代码量。 – Brook 2011-06-03 15:33:11

+0

与此类似,Autofac还支持通过DynamicProxy2拦截方法http://code.google.com/p/autofac/wiki/DynamicProxy2 – bentayloruk 2011-06-03 15:48:46

+0

相关:http://stackoverflow.com/questions/2028747/caching-code-location在一个领域驱动设计 – 2011-06-03 16:17:04

回答

5

简单的选择:有条件注册代表

有许多方法可以做到这一点。在注册代表使用您的缓存设置可能是最简单的(并说明委托注册的功率):

var builder = new ContainerBuilder(); 

bool cache = GetCacheConfigSetting(); //Up to you where this setting is.  

builder.Register(c => cache ? (IRepository<string>)new CachingRepository<string>(new RealRepos<string>(), new CacheImpl()) : new RealRepos<string>()); 

上面的代码将只读取缓存配置一次。您还可以在注册代理中包含GetCacheConfigSetting()。这会导致每个Resolve(假设为InstancePerDependency)都检查设置。

其他选项:Autofac装饰和模块

有Autofac的一些更先进的功能,你还可以找到有用的。您问题中的缓存类是Decorator Pattern的示例。 Autofac has explicit support for decorators。它还有一个很好的模型来构建注册和管理配置信息,称为Modules

+0

这是辉煌的。由于其他原因,我一直在使用委托注册,这是完美的解决方案。 – n8wrl 2011-06-20 13:51:24