如何在Autofac中注册传统接口

时间:2016-07-25 11:56:58

标签: autofac

我的项目中有一个autofac DI。 我希望通过常规公开一个接口,我的项目的所有其他接口都将从该接口继承。是否可以在启动级别自动注册继承接口的组件?例如:

Public interface IConvetionInterface {}
public interface IImplementationA:IConvetionInterface 
{
public void DoSomethingA();
}

public interface IImplementationB:IConvetionInterface 
{
public void DoSomethingB();
}

通过构造函数注入;

public class ConsumerA
    {
        private readonly IImplementationA _a;

        public DealerRepository(IImplementationA A)
        {
            _a= A;
        }

        public Act()
        {
            _a.DoSomethingA();


        }

    }

如何注册IConvetionInterface以使其所有依赖项在Autofac中解析。

1 个答案:

答案 0 :(得分:0)

我已经能够使用其文档页面Autofac Documentation Page

中提供的autofac Assembly Scanning配置来提出此解决方案。

我有一个开放的通用界面

public interface IRepository<TEntity, TPrimaryKey> where TEntity : class, IEntity<TPrimaryKey>
    { }

实施
public class Repository<TEntity, TPrimaryKey> : RepositoryBase<TEntity, TPrimaryKey>
        where TEntity : class, IEntity<TPrimaryKey>{}

然后,我创建了一个空接口

public interface IConventionDependency
    {

    }

调用此方法以在启动级别注册我的组件:

public static void RegisterAPSComponents(ContainerBuilder builder)
        {
            builder.RegisterType<APSContext>().InstancePerRequest();
            builder.RegisterGeneric(typeof(Repository<,>)).As(typeof(IRepository<,>)).InstancePerLifetimeScope();




  builder.RegisterAssemblyTypes(typeof(IConventionDependency).Assembly).AssignableTo<IConventionDependency>().As<IConventionDependency>().AsImplementedInterfaces().AsSelf().InstancePerLifetimeScope();



        }

通过上述注册,任何继承自IConventionDependency的接口都将自动注册到容器中。

例如:  创建一个界面:

public interface IDealerRepository : IConventionDependency
    {
        List<Dealers> GetDealers();
    }

然后实现界面:

public class DealerRepository : IDealerRepository
    {
        private readonly IRepository<VTBDealer, int> _repository;

        public DealerRepository(IRepository<VTBDealer, int> repository)
        {
            _repository = repository;
        }

        public List<Dealers> GetDealers()
        {
            return _repository.GetAllList().MapTo<List<Dealers>>();


        }

    }

总之,如果没有显式注册IDealerRepository,它将在MVC Controller构造函数中得到解决。