2017-04-12 15 views
1

私は次の問題がある、私はなぜこのコードは仕事をしないのか分からない。なぜなら、私はautofacによってコンストラクタのクラスを注入するのではなく、どうやってそれを行うのかわからないからだ。それは良い方法ですか?autofacインスタンスのコンストラクタ内のクラス

私がジェネレータを追加する前に、私はこのジェネレータコードをサービス業務にコメントするとこの仕事をします。

これは私のコードです:私はSERVを呼び出すクラスコントローラー持っ

public class ZonesController : Controller 
{ 
    private IZoneService zoneService; 

    public ZonesController(IZoneService zoneService) 
    { 
     this.zoneService = zoneService; 
    } 

    [HttpGet] 
    //Do work 
} 

をこれは、サービスとのインタフェースである:

public class ZoneService : IZoneService 
{ 
    private readonly IZoneRepository zoneRepository; 
    private readonly IDtoFactory dtoFactory; 
    private readonly ZoneGenerator zoneGenerator; 

    public ZoneService(IZoneRepository zoneRepository, 
           IDtoFactory dtoFactory, 
           ZoneGenerator zoneGenerator) 
    { 
     this.zoneRepository = zoneRepository; 
     this.dtoFactory = dtoFactory; 
     this.zoneGenerator = zoneGenerator; 
    } 

    public void Add(ZoneDetailDTO zone) 
    { 
     zoneGenerator.Generate(zone); 
    } 

    //Do Work 
} 

public interface IZoneService 
{ 
    void Add(ZoneDetailDTO zone); 
    //Do Methods 
} 

発電ohterクラスを呼び出し、工場:

public class ZoneGenerator 
    { 
     private readonly ZoneFactory zoneFactory; 
     private readonly IZoneRepository zoneRepository; 

     public ZoneGenerator(ZoneFactory zoneFactory, IZoneRepository zoneRepository) 
     { 
      this.zoneFactory = zoneFactory; 
      this.zoneRepository = zoneRepository; 
     } 

     public void Generate(ZoneDetailDTO zoneModel) 
     { 
      var zone = zoneFactory.Create(zoneModel); 
      zoneRepository.Add(zone); 
     } 
    } 

ファクトリー:

public class ZoneFactory 
{ 
    private readonly ZoneMapFactory zoneMapFactory; 
    private readonly ZoneScheduleFactory zoneScheduleFactory; 

    public ZoneFactory(ZoneMapFactory zoneMapFactory, 
           ZoneScheduleFactory zoneScheduleFactory) 
    { 
     this.zoneMapFactory = zoneMapFactory; 
     this.zoneScheduleFactory = zoneScheduleFactory; 
    } 

    public Zone Create(zoneDetailDTO zone) 
    { 
     var map = zoneMapFactory.Create(zone.Map.Address, zone.Map.Latitude, zone.Map.Longitude); 
     var schedule = zoneScheduleFactory.Create(zone.Schedule.StartHour, zone.Schedule.EndHour); 

     return new Zone(zone.Name, 
         zone.ProvinceId, 
         map, 
         schedule, 
         zone.Tags); 
    } 
} 

そして最後に、私のコンテナ:

//method in Startup class Asp.Net Core 
public IServiceProvider ConfigureServices(IServiceCollection services) 
    { 
     services.AddSingleton(_ => Configuration); 

     // Add framework services. 
     services.AddApplicationInsightsTelemetry(Configuration); 

     services.AddMvc(); 

     var containerBuilder = new ContainerBuilder(); 
     containerBuilder.RegisterModule<DefaultModule>(); 
     containerBuilder.Populate(services); 
     var container = containerBuilder.Build(); 
     return new AutofacServiceProvider(container); 
    } 

public class DefaultModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     builder.RegisterType<ZoneService>().As<IZoneService>(); 
     builder.RegisterType<ZoneRepository>().As<IZoneRepository>(); 
     builder.RegisterType<ProvinceService>().As<IProvinceService>(); 
     builder.RegisterType<ProvinceRepository>().As<IProvinceRepository>(); 
     builder.RegisterType<DtoFactory>().As<IDtoFactory>(); 
    } 
} 

答えて

1

あなたのLoadメソッドに以下を追加するために見逃している:

builder.RegisterType<ZoneGenerator>().AsSelf(); 
builder.RegisterType<ZoneFactory>().AsSelf(); 
builder.RegisterType<ZoneMapFactory>().AsSelf(); 
builder.RegisterType<ZoneScheduleFactory>().AsSelf(); 
+0

あなたは正しいです、どうもありがとう! !!、あなたが自動的に工場、倉庫とサービスを注入することができるいくつかの方法を知っている、またはこれが唯一の方法です。再度、感謝します。 –

+1

あなたは大歓迎です!私が知っている限り、これは唯一の方法です.. – Christos

関連する問題