2017-02-23 129 views
3

我有以下接口,抽象类等高级依赖注入在ASP.NET核心

public interface IAggregateRootMapping<T> : IAggregateDefinition where T : AggregateRoot 
{ 
    IEnumerable<Expression<Func<T, object>>> IncludeDefinitions { get; } 
} 

public abstract class AggregateRootMapping<T> : IAggregateRootMapping<T> where T : AggregateRoot 
{ 
    public abstract IEnumerable<Expression<Func<T, object>>> IncludeDefinitions { get; } 
} 

public class OrderAggregateRootMapping : AggregateRootMapping<Order> 
{ 
    public override IEnumerable<Expression<Func<Order, object>>> IncludeDefinitions 
    { 
     get 
     { 
      return new Expression<Func<Order, object>>[] { 
       order => order.Supplier 
      }; 
     } 
    } 
} 

我用那些在另一类是这样的:

public class Repository<TAggregateRoot> : IRepository<TAggregateRoot> where TAggregateRoot : AggregateRoot 
{ 
    private readonly AggregateRootMapping<TAggregateRoot> _aggregateRootMapping; 

    public Repository(AggregateRootMapping<TAggregateRoot> aggregateRootMapping) 
    { 
     _aggregateRootMapping = aggregateRootMapping; 
    } 
Do something... 
} 

如何使用依赖注入的ASP.NET核心,以便在运行时匹配类被注入? 例如,如果AggregateRoot类型类是Order,而不是Repository类,则应该注入OrderAggregateRootMapping类。 如何在.NET Core的启动类的ConfigureServices中使用ServiceCollection来完成此操作?

回答

1

默认情况下的依赖注入非常基本。如果你想开始基于泛型的规则,你需要使用不同的实现。

但是,如果您愿意一个接一个地编写依赖关系,您仍然可以继续使用。

在你Startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddScoped<AggregateRootMapping<Order>, OrderAggregateRootMapping>(); 
    services.AddScoped<Repository<Order>>(); 

    // Add framework services. 
    services.AddMvc(); 
} 

然后你就可以通过将其注入控制器,例如使用Repository类。

在ValuesController.cs

[Route("api/[controller]")] 
public class ValuesController : Controller 
{ 
    private Repository<Order> _repository; 

    public ValuesController(Repository<Order> repository) 
    { 
     _repository = repository; 
    } 
} 

ValuesController然后将收到的,这将已经用OrderAggregateRootMapping创建Repository<Order>一个实例。