我正在尝试创建一个模块(将在一个简单的ASP站点中引用,使用Autofac Web窗体集成),该模块具有特定要求。 它应该返回使用一组特定规则创建的字符串。这些规则由策略定义,每个“Actor”都有所不同。将根据来自请求的值在运行时选择“Actor”。为了使事情变得更难,一些“演员”可以基于例如请求的国家而具有该策略的不同且具体的实现。
我已经使用抽象和具体工厂解决了这个问题(第一个了解哪个“Actor”具体工厂使用,第二个确定我是否需要特定或通用actor的策略)。问题是,采用强模块化设计后,我需要使用反射来获得对特定actor的策略类的间接引用(否则我应该引用包含所有特定策略实现的所有dll)。
我很想避免这种方法,主要是因为我想使用一种独特的方式来动态加载所需的组件。
我已经看过一些Autofac的可能性,根据我的理解,我可以注册相同界面的不同实现,并使用如此处所述的密钥解决它们(https://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices)。问题是我不知道如何在我的抽象和具体工厂内解决它们(我没有参考那里的解析器......我认为我应该避免它)。
所以我的问题是:
1)如何在该场景中使用Autofac?什么是最佳实践(当然我错过了巨大的东西)
2)我是否必须重新考虑该模块的所有设计?我的意思是,我还需要使用抽象和具体的工厂吗?
3)有人能指出我可能与我的问题有关的一些例子或教程吗?
非常感谢你的帮助,对于这个漫长而不那么明确的问题感到抱歉。
答案 0 :(得分:1)
一种可能的方法是将您的策略划分为通用策略和特定于行为者的策略。你已经在脑海中做到了这一点,但我不知道你的代码是否反映了这一点。
IActorSpecificStrategy
和IGenericStrategy
。 bool CanHandleActor(IActor actor)
添加到两个接口(或接口都来自)。IActorSpecificStrategy
,另一个包含IGenericStrategy
。IActorSpecificStrategy
个实例并返回CanHandleActor
返回true
的第一个实例。否则,请返回IGenericStrategy
返回CanHandleActor
的第一个true
。如果这不适用于您的问题,请详细说明如何选择策略。