我有一个在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。
有没有人遇到这样的事情?
答案 0 :(得分:2)
有没有人遇到这样的事情?
XML配置被认为是配置DI容器的过时方式。这种类型的配置非常脆弱,并且不提供编译时类型检查,因此维护比在代码中配置更难。所以,是的,许多人遇到了这种情况,结果改变了他们配置容器的方式。
在这种特殊情况下,在您将应用程序部署到服务器之前,编译器会在您的开发计算机上发现这一点。
当我直接在api项目中引用DataLayer dll时,它们都开始在appservice上工作了。
虽然这是一个肮脏的解决方法。我觉得很奇怪,Unity无法找到api项目没有直接引用的dll。
不,这不是一个肮脏的解决方法。 assembly containing the composition root to reference all layers of the application是正常的。