【发布时间】:2018-04-23 10:46:06
【问题描述】:
我开始使用 DI/IoC,但在理解所有概念时遇到了一些麻烦。
我之所以选择 Autofac,是因为它似乎是少数同时支持 .Net 4.6+ 和 .Net Core 的公司之一。它似乎也是使用最广泛的。
1) 构造函数注入 - 例如在控制器或我的 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 注入存储库
我想用 Container 注册上下文并将其注入到 UnitOfWork 和 Repository 的对象构造函数中。我想确保将相同的实例注入到所有对象中。我如何在 Autofac 中做到这一点?
public class Repository : IRepository {
//context injected here
public Repository (DbContext context){ ... }
}
public class Manager {
public void SomeMethod(){
IRepository = RepositoryFactoryGetDataRepository<ISomeTypeRepository>
}
}
【问题讨论】:
标签: c# entity-framework inversion-of-control autofac ioc-container