2017-02-23 11 views
3

私は、など次のインタフェース、抽象クラスを持っている高度な依存性の注入

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タイプのクラスがRepositoryクラスのOrderよりも大きい場合、OrderAggregateRootMappingクラスを注入する必要があります。 .NETコアのStartupクラスのConfigureServicesでServiceCollectionを使用してこれを行うにはどうすればよいですか?

答えて

1

デフォルトでは依存性注入が非常に基本的です。ジェネリックスに基づいてルールの配線を開始する場合は、別の実装を使用する必要があります。

しかし、依存関係を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>のインスタンスを受信することになります。