使用 Unity,可以在构建容器之前解决依赖关系。 Autofac 也可以吗?
下面的代码演示了我的场景 - 我需要解决ICacheRepository
为了“更新”单例CacheHelper
.
在 Unity 中,这可以简单地完成container.Resolve<ICacheRepository>()
在 ??? 的地方。那么在 Autofac 中呢?
var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
var cacheHelper = new CacheHelper(???);
builder.RegisterInstance(cacheHelper).As<CacheHelper>();
Where CacheHelper
类有一个构造函数依赖CacheRepository
.
public class CacheHelper
{
private readonly ICacheRepository _repository;
public CacheHelper(ICacheRepository repository)
{
_repository = repository;
}
}
您不必在构建过程中解析组件。Autofac能够解决对象图依赖性。在你的情况下CacheHelper
依赖于取决于ICacheRepository
所以你只需要注册CacheHelper
and ICacheRepository
var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
builder.RegisterType<CacheHelper>().As<CacheHelper>();
When Autofac将解决CacheHelper
它将创建依赖图并创建实例CacheHelper
以 ofsi 为例ICacheRepository
。如果您需要有一个辛格尔顿您可以告诉 Autofac 仅创建一个实例。
var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
builder.RegisterType<CacheHelper>().As<CacheHelper>().SingleInstance();
另一种解决方案是注册 lambda 表达式,这些注册会在您需要时调用,因此您可以resolve构建过程中的事情:
var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
builder.Register(c => new CacheHelper(c.Resolve<ICacheRepository>()))
.As<CacheHelper>()
.SingleInstance(); // It will result of having one CacheHelper whereas
// ICacheRepository is declared as .InstancePerDependency
请小心使用此解决方案,因为ICacheRepository
声明没有范围InstancePerDependency
默认情况下将使用范围。因为CacheHelper
is SingleInstance
只有一个实例ICacheRepository
将使用这可能会导致错误。看圈养依赖 http://blog.ploeh.dk/2014/06/02/captive-dependency/了解更多信息。
就您而言,您似乎不需要这种注册。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)