我的项目中有一个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中解析。
答案 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构造函数中得到解决。