Unity没有找到引用的Dll

时间:2018-01-24 17:22:54

标签: c# .net azure dependency-injection unity-container

我有一个在Azure应用服务上部署的网络应用。

它有三层。

API->商家 - >数据

API引用业务层的组装,业务层引用数据层的组件,(使用实体框架进行数据库事务)。

我正在使用Unity容器来引入依赖注入web.config,就像这样。

       <unity>
<!-- lifetimes -->
<alias alias="singleton" type="Unity.Lifetime.ContainerControlledLifetimeManager, Unity.Abstractions" />
<alias alias="transient" type="Unity.Lifetime.TransientLifetimeManager, Unity.Abstractions" />
<alias alias="perThread" type="Unity.Lifetime.PerThreadLifetimeManager, Unity.Abstractions" />
<alias alias="externallyControlled" type="Unity.Lifetime.ExternallyControlledLifetimeManager, Unity.Abstractions" />

<!-- injection -->
<containers>
  <container>
    <types>
      <register type="DALContextInterface, DALInterfaceAssembly" mapTo="DALContextClass, Assembly">
        <lifetime type="perThread" />
      </register>
      <register type="BusinessLayerManagerInterface, Assembly" mapTo="BusinessLayer, Assembly">
        <lifetime type="perThread" />
        <property name="Db" dependencyType="DALContextClass, Assembly" />
      </register>
      <register type="IHomeController, Assembly" mapTo="HomeController, Assembly">
        <lifetime type="singleton" />
      </register>
    </types>
     </container>
    </containers>
   </unity>

在控制器构造函数

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

这一切在本地完美地完成依赖注入。

但是当我将它部署到azure app服务时会出现问题。

unity无法使用上面的配置声明加载DALContext。 虽然Dll存在于AppService Bin目录中。

只有经过一些故障排除才能打动我,这可能是因为我的Api项目没有直接引用DataLayer DLL。

当我直接在api项目中引用DataLayer dll时,它们都开始在appservice上工作了。

虽然这是一个肮脏的解决方法。我觉得很奇怪,Unity无法找到api项目没有直接引用的dll。

有没有人遇到这样的事情?

1 个答案:

答案 0 :(得分:2)

  

有没有人遇到这样的事情?

XML配置被认为是配置DI容器的过时方式。这种类型的配置非常脆弱,并且不提供编译时类型检查,因此维护比在代码中配置更难。所以,是的,许多人遇到了这种情况,结果改变了他们配置容器的方式。

在这种特殊情况下,在您将应用程序部署到服务器之前,编译器会在您的开发计算机上发现这一点。

  

当我直接在api项目中引用DataLayer dll时,它们都开始在appservice上工作了。

     

虽然这是一个肮脏的解决方法。我觉得很奇怪,Unity无法找到api项目没有直接引用的dll。

不,这不是一个肮脏的解决方法。 assembly containing the composition root to reference all layers of the application是正常的。