繁体   English   中英

Autofac构造函数/属性注入(DbContex

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM