Unity - 通过XML创建工厂

4
我是使用Unity框架作为IoC容器。
我的配置看起来像这样:
```html

我正在使用Unity框架作为IoC容器。

我的配置大致如下:

```
<unity>
  <container>
    <register type="Namespace1.IFoo, FooAsm"
              mapTo="Namespace2.Bar, BarAsm">
    </register>
</conainer>

我希望使用工厂方法注册一个容器。如何在app.config中实现呢?

我想要的是类似于这样的操作:

<unity>
  <container>
    <register type="Namespace1.IFoo, FooAsm"
              factory="Namespace2.Bar, BarAsm"
              method="create">
    </register>
  </conainer>
</unity>

有什么建议吗?

1
切换到基于代码的配置,说真的。如果可以的话,远离通过XML配置容器,因为它容易出错且不稳定。基于代码的配置更加灵活,并且在编译时提供支持。 - Steven
它更加灵活,因为您可以为实例注册lambda表达式。没有强引用的用处是什么?由于您在XML中命名了类型,因此您隐含地仍然对类型有一个引用,但现在您失去了编译时检查。 - Steven
1
我也会建议基于代码的配置,编译时检查所提供的优势远远大于 XML 所提供的任何好处(我真的想不出有什么好处)。 - Lukazoid
1
可能是重复的问题,参考如何在XML配置中声明Unity InjectionFactory - Lukazoid
2
XML确实非常适合部署期间需要更改的配置部分,但这并不意味着您的完整配置应该在XML中。相反:尽可能将配置放入代码中,并仅将需要更改的内容放入XML中(Unity允许您混合使用)。或者...使用插件模型:在启动期间从插件目录动态加载程序集,并在容器中注册其类型。这样,您可以全部在代码中完成,而无需在插件更改时更改XML配置。 - Steven
显示剩余2条评论
2个回答

4

这篇帖子提供了一个很好的关于如何为Unity添加工厂方法支持的回应。实际上,您需要下载这个Bitbucket源代码(并更改引用到4.0框架)。
如果您现在添加Unity的泛型支持,则可以获得一个非常棒的解决方案,可能看起来像这样:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <unity xmlns="schemas.microsoft.com/practices/2010/unity">
    <sectionExtension type="Unity.FactoryConfig.FactoryConfigExtension, Unity.FactoryConfig"/>
    <alias alias="Factory" type="Namespace1.GenericFactory`1, asm1"/>
    <container>
      <register type="Namespace1.ITest, asm1">
        <factory type="Factory[[Namespace1.ITest, asm1]]" method="Create" />
      </register>
    </container>
  </unity>
</configuration>

使用XML配置支持Unity框架的通用工厂!
感谢所有评论 :)


我选择了这种方法,它完全按照我的期望工作。 - Rob

1

我不认为目前有内置的方法来实现这一点。 我通常只是注册工厂本身(Map IMyFactory -to-> MyFactoryImpl),然后将工厂注入到需要它的类中,并让这些类调用工厂。

不过,我认为你可能可以通过为Unity制作一个扩展程序直接调用工厂来完成这个任务。 在这个问题的答案中提到了几种扩展程序:How to create objects using a static factory method?


1
http://stackoverflow.com/questions/3815581/microsoft-unity-issue-with-resolve <- 看起来有工厂支持,但我找到的示例都是代码方式的。我还没能将它们翻译成xml。 - Jaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接