使用autofac解析动态对象创建(在另一个动态创建的对象内)

时间:2013-04-12 11:22:34

标签: c# dependency-injection autofac

我正在尝试创建一个模块(将在一个简单的ASP站点中引用,使用Autofac Web窗体集成),该模块具有特定要求。 它应该返回使用一组特定规则创建的字符串。这些规则由策略定义,每个“Actor”都有所不同。将根据来自请求的值在运行时选择“Actor”。为了使事情变得更难,一些“演员”可以基于例如请求的国家而具有该策略的不同且具体的实现。

我已经使用抽象和具体工厂解决了这个问题(第一个了解哪个“Actor”具体工厂使用,第二个确定我是否需要特定或通用actor的策略)。问题是,采用强模块化设计后,我需要使用反射来获得对特定actor的策略类的间接引用(否则我应该引用包含所有特定策略实现的所有dll)。

我很想避免这种方法,主要是因为我想使用一种独特的方式来动态加载所需的组件。

我已经看过一些Autofac的可能性,根据我的理解,我可以注册相同界面的不同实现,并使用如此处所述的密钥解决它们(https://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices)。问题是我不知道如何在我的抽象和具体工厂内解决它们(我没有参考那里的解析器......我认为我应该避免它)。

所以我的问题是:

1)如何在该场景中使用Autofac?什么是最佳实践(当然我错过了巨大的东西)

2)我是否必须重新考虑该模块的所有设计?我的意思是,我还需要使用抽象和具体的工厂吗?

3)有人能指出我可能与我的问题有关的一些例子或教程吗?

非常感谢你的帮助,对于这个漫长而不那么明确的问题感到抱歉。

1 个答案:

答案 0 :(得分:1)

一种可能的方法是将您的策略​​划分为通用策略和特定于行为者的策略。你已经在脑海中做到了这一点,但我不知道你的代码是否反映了这一点。

  • 有两个接口IActorSpecificStrategyIGenericStrategy
  • 将方法bool CanHandleActor(IActor actor)添加到两个接口(或接口都来自)。
  • 在工厂中输入两个枚举:一个包含IActorSpecificStrategy,另一个包含IGenericStrategy
  • 当请求演员的策略时,首先枚举所有IActorSpecificStrategy个实例并返回CanHandleActor返回true的第一个实例。否则,请返回IGenericStrategy返回CanHandleActor的第一个true

如果这不适用于您的问题,请详细说明如何选择策略。