Unity可以配置为在运行时加载和卸载模块

时间:2017-03-09 12:31:49

标签: c# .net dependency-injection inversion-of-control unity-container

目前我正在使用Unity在运行时解析类型。

IUnityContainer _container = new UnityContainer();
_container.LoadConfiguration();

var instance = _container.Resolve<IGenericLib>("Class1");

instance.DoSomething();

所以,我现在只是在解决Class1,虽然我在配置部分定义了三种类型。

<unity>
    <namespace name="GenricType.Interface"/>
    <namespace name="Sample.Type1"/>
    <namespace name="Sample.Type2"/>
    <namespace name="Sample.Type3"/>
    <assembly name="GenricType.Interface"/>
    <assembly name="Sample.Type1"/>
    <assembly name="Sample.Type2"/>
    <assembly name="Sample.Type3"/>
    <container>
      <register type="IGenericLib" mapTo="Class1" name="Class1"/>
      <register type="IGenericLib" mapTo="Class2" name="Class2"/>
      <register type="IGenericLib" mapTo="Class3" name="Class3"/>
    </container>
  </unity>

现在我设置一个断点来查看加载的模块,这里是快照。

在我调用Load Configuration之前,我的所有aseemblies都没有加载到内存中,

enter image description here

但是调用了当前的加载配置,我的所有三个装配都被加载了,尽管我只是在解决Class1。

enter image description here

有没有办法控制这些模块的加载?只需加载当前解析后的模块,并在使用后卸载。

1 个答案:

答案 0 :(得分:1)

LoadContainer()加载所有已配置的模块。在<container>部分,您有三个模块,因此统一加载所有三个模块。解决方案只是采用已加载模块的实例。要控制要加载的模块,可以使用重载方法:

IUnityContainer container = new UnityContainer()
    .LoadConfiguration("Class1");

您还可以从不同的部分加载模块:

IUnityContainer container = new UnityContainer()
    .LoadConfiguration(section)  // Loads unnamed <container> element
    .LoadConfiguration(section, "otherContainerElement"); // named <container> element