【发布时间】:2010-07-16 22:19:33
【问题描述】:
在我们的项目中,我们实现了一个简单的工具,让一方发布动态组件,而其他方 - 使用它们。我想逐步淘汰我们的内部实施,并准备好现成的东西。由于我们的 UI 人员已经使用 Caliburn+Prism+Unity,因此我决定使用 Unity(拥有两个不同的 IoC 容器实现似乎很奇怪)。
为了这个问题,以下是玩家:
- 实体类型(
A、B) - 实体工厂(
FactoryA,FactoryB) - 实体管理器 (
Manager) - 客户
截至目前,Manager 具有 RegisterFactory(IFactory) API,这是注册新实体类型的唯一方法 - 必须通过新的实体工厂实例调用它。
但是,客户端对此方法的显式调用很少见,因为Manager 运行我们的内部引擎,该引擎检查特定文件夹中的所有程序集并加载那些声明特定程序集级别属性的程序集。该属性指定特定实体工厂的类型,以便引擎可以实例化它(使用Activator.CreateInstance)并调用RegisterFactory API。
此外,引擎会监控文件夹并知道动态加载新程序集。
例如,如果 C 是在程序集 Foo.dll 中实现的新实体类型,则程序集应具有如下所示的程序集级别属性:
[assembly: PublishEntity(typeof(FactoryC))]
然后将 Foo.dll 放在该特殊文件夹中会导致引擎:
- 检查它并在那里找到相关的程序集级属性实例
- 使用反射创建一个新的
FactoryC实例 - 调用
Manager.RegisterFactory,将FactoryC实例作为参数传递。
重点是我希望使用 Unity 来实现相同的功能。
有什么想法吗?
谢谢。
编辑
需要 Manager 和 Factory 类型。我有兴趣消除的是临时注册工具——属性、RegisterFactory 方法和扫描文件夹并加载相关程序集的引擎。现在我意识到 Unity 可能还不够。我有兴趣了解可以满足我们需求的免费解决方案。我只是希望使用众所周知且经过测试的东西,最好是渴望成为标准的东西。
【问题讨论】:
标签: .net unity-container ioc-container