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

本文关键字:对象 动态 创建 另一个 autofac 使用 解决 | 更新日期: 2023-09-27 18:08:55

我试图创建一个模块(将在一个简单的ASP网站引用,使用Autofac Web表单集成),有一个特殊的要求。它应该返回使用一组特定规则创建的字符串。这些规则是由策略定义的,每个"参与者"都不同。"Actor"将在运行时根据来自请求的值进行选择。为了使事情变得更加困难,某些"参与者"可以基于请求的国家/地区,对该策略有不同的特定实现。

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

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

我已经看了一些Autofac的可能性,从我所理解的,我可以注册相同接口的不同实现,并使用这里解释的键来解决它们(https://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices)。问题是,我不知道如何在我的抽象和具体工厂内解决它们(我没有参考那里的解析器…我想我应该避免它)。

我的问题是:

1)在这种情况下我如何使用Autofac ?最佳实践是什么(我肯定错过了一些巨大的东西)

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

3)谁能指出一些例子或教程可能与我的问题?

非常感谢您的帮助,很抱歉我的问题又长又不清楚。

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

一种可能的方法是将您的策略分为通用策略和特定于参与者的策略。你已经在脑子里做过了,但我不知道你的代码是否反映了这一点。

  • IActorSpecificStrategyIGenericStrategy两个接口。
  • 为两个接口(或两个接口的派生接口)添加方法bool CanHandleActor(IActor actor)
  • 注入两个枚举到你的工厂:一个包含IActorSpecificStrategy,一个包含IGenericStrategy
  • 当请求参与者的策略时,首先枚举所有IActorSpecificStrategy实例并返回CanHandleActor返回true的第一个实例。否则返回CanHandleActor返回true的第一个IGenericStrategy

如果这不适用于您的问题,请更详细地解释如何选择策略。