【问题标题】:Resolving dynamic object creation (inside another dynamically created object) with autofac使用 autofac 解决动态对象创建(在另一个动态创建的对象内)
【发布时间】:2013-04-12 11:22:33
【问题描述】:

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

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

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

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

所以我的问题是:

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

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

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

非常感谢您的帮助,对于这个冗长且不太清楚的问题,我们深表歉意。

【问题讨论】:

    标签: c# dependency-injection autofac


    【解决方案1】:

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

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

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

    【讨论】:

    • 首先,感谢您惊人的快速响应!我完全同意你的前两点,我会尽快实施。我只是对最后两点有疑问:我应该在哪里执行注入(我的意思是,谁应该负责执行此操作,我认为应该在启动期间在配置构建中完成,对吗?)。最后,这种方法是否意味着我将为每个请求创建所有这些策略的实例(并且只使用一个?)我认为 autofac 应该为我处理这些细节,所以我不应该打扰,对吗?跨度>
    • @Gnegno:关于你在第一个版本中提到的业务点:这两个接口很可能是marker interfaces,根本没有任何方法或属性。注入由 Autofac 完成,通常在您的组合根目录中,因此您无需费心。只需给策略工厂(实际上,它现在是一个策略选择器)一个带有这两个枚举的构造函数。通常,策略本身不会保存任何状态,因此它们将被注册为单例(Autofac 中的.SingleInstance())。
    • 是的,很抱歉第一个评论版本...我最初误解了接口的用途。我认为您的解决方案将完全符合我的需求。一旦我有一个功能原型,我会尽快通知你。提前很多坦克!
    • 我还有最后一个问题。我已经成功更新了我的测试代码以符合您指出的解决方案,它看起来更容易而且很棒!现在我必须配置 Autofac 以读取所有策略。这种做法对吗? builder.RegisterAssemblyTypes(partnerAssembly).As();而且,我该如何做下一步(在选择器中注入所有读取的类型)?
    • 我找到了第二个问题的答案……抱歉匆忙。我将使用 container.Resolve>();
    猜你喜欢
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2011-04-23
    相关资源
    最近更新 更多