[英]Autofac constructor/property injection (DbContex
我开始使用DI / IoC,但在理解所有概念时遇到了一些麻烦。
我选择Autofac是因为它似乎是同时支持.Net 4.6+和.Net Core的少数几个。 似乎它也是使用最广泛的。
1)构造函数注入-例如在Controllers或WCF服务中,我了解不可能对我在代码中实例化的对象进行构造函数注入,这意味着它不会自动实例化。
2)属性注入我想做一些类似于您在Ninject中做的事情:
[Inject]
public IWeapon Weapon { get; set; }
正如我理解的那样,在Autofac中。 等于:
builder.RegisterType<Weapon>().As<IWeapon>().PropertiesAutowired();
1.现在,为什么构造函数注入是首选方式?
例如,我有:
这些工厂只是一线工作,应该(从另一个IoC)执行以下操作:
public class DataRepositoryFactory : IDataRepositoryFactory
{
T IDataRepositoryFactory.GetDataRepository<T>()
{
return ObjectBase.Container.GetExportedValue<T>();
}
}
有些方法需要两者,有些则不需要。 做类似的事情:
public SampleControllerOrManager(IUnitOfWork unitOfWork, IRepositoryFactory repositoryFactory, IBusinessEngineFactory engineFactory)
似乎浪费资源。
我知道这有助于测试(?)。
但这看起来更干净:
public SampleControllerOrManager(IUnitOfWork unitOfWork)
[Inject]
public IRepositoryFactory RepositoryFactory { get; set; }
[Inject]
public IBusinessEngineFactory EngineFactory { get; set; }
2.将实体框架DbContext注入存储库
我想向容器注册上下文,并将其注入到UnitOfWork和存储库的对象构造函数中。 我想确保将相同的实例注入所有对象。 如何在Autofac中进行?
public class Repository : IRepository {
//context injected here
public Repository (DbContext context){ ... }
}
public class Manager {
public void SomeMethod(){
IRepository = RepositoryFactoryGetDataRepository<ISomeTypeRepository>
}
}
构造函数注入是首选方法,因为它使它们显而易见。 如果不提供所需的依赖关系,则无法实例化该类。
使用属性注入的依赖项是隐藏的,您可以在缺少一些注入的情况下实例化该类,这可能会使您相信该类已完全初始化并可以使用。 最终,如果尝试使用需要缺少依赖项的功能,则可能会出错。
为了确保注入相同的实例,您可以将DbContext注册为Singleton 。 例如:
var builder = new ContainerBuilder();
builder.RegisterType<DbContext>().SingleInstance();
或者,根据您的需要,可以使用“ 每个请求的实例”范围进行注册:
var builder = new ContainerBuilder();
builder.RegisterType<DbContext>().InstancePerRequest();
注意 :您可能会发现Martin Fowler撰写的这篇文章很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.