在我们的项目中,我们已经实现了一个简单的工具,让一方发布动态组件,而另一方则使用它们。我想逐步淘汰我们的内部实施,并准备好现成的东西。由于我们的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来实现相同的功能。
有什么想法吗?
感谢。
修改
需要经理和工厂类型。我有兴趣消除的是ad-hoc注册工具 - 属性,RegisterFactory方法以及扫描文件夹并加载相关程序集的引擎。现在我意识到Unity可能还不够。我很想知道满足我们需求的免费解决方案。我只想使用一些众所周知和经过测试的东西,最好是有志成为标准的东西。
答案 0 :(得分:0)
Unity需要一个类型配置,可以在app config中,也可以在运行时构建。您当前的引擎通过进行装配探测来增加价值。 Unity只是不这样做。
我看到Unity服务的唯一目的是通过允许客户端使用Unity解析实体(和工厂?)来替换您的管理器和可能的工厂类。您可以继续允许引擎使用它找到的程序集来热配置Unity。