2

.netコアと依存性注入の概念が新しくなりました。私はWeb APIのコンストラクタにサービスインターフェイスを注入したい、サービスインターフェイスと実装は別のプロジェクトにあります。.netコアのWeb APIコンストラクタの依存関係を解決するには

public class EntriesController : Controller 
{ 
    IEntriesService entryService; 
    public EntriesController(IEntriesService _entryService) 
    { 
     entryService = _entryService; 
    } 

    // GET: api/values 
    [HttpGet] 
    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" }; 
    } 
} 

問題がある、私はすでに、線の下に

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 

    services.AddSingleton<IEntriesService, EntriesService>(); 
} 

私のコントローラを追加し、

startup.csでApplication Layers

、自分のアプリケーションの層の下に見つけてください、私は私のAPIアプリケーションを実行すると、私のコンストラクタに当たっていないと私の下に空白のページを示す、

Error page

コンストラクタを追加することなく、アプリケーションが正常に動作しています。

マイIEntriesService、

public interface IEntriesService 
{ 
    RepeatEntries Get(int Id); 
} 

マイEntriesService、

public class EntriesService : IEntriesService 
{ 
    IUnitOfWork _unitOfWork; 
    public EntriesService(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 

    public bool Add(RepeatEntries entity) 
    { 
     _unitOfWork.EntryRepository.Add(entity); 
     return true; 
    } 
} 

マイIUnitOfWork、

public interface IUnitOfWork : IDisposable 
{ 
    IEntriesRepository EntryRepository { get; } 
    void Complete(); 
} 

私のUnitOfWork、

public class UnitOfWork : IUnitOfWork 
{ 
    private readonly IEntriesRepository _entryRepository; 
    public UnitOfWork(IEntriesRepository entryRepository) 
    { 
     _entryRepository = entryRepository; 
    } 

    public IEntriesRepository EntryRepository 
    { 
     get 
     { 
      return _entryRepository; 
     } 
    } 

    void IUnitOfWork.Complete() 
    { 
     throw new NotImplementedException(); 
    } 

    #region IDisposable Support 
    private bool disposedValue = false; // To detect redundant calls 



    protected virtual void Dispose(bool disposing) 
    { 
     if (!disposedValue) 
     { 
      if (disposing) 
      { 
       // TODO: dispose managed state (managed objects). 
      } 

      // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below. 
      // TODO: set large fields to null. 

      disposedValue = true; 
     } 
    } 

    // TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources. 
    // ~UnitOfWork() { 
    // // Do not change this code. Put cleanup code in Dispose(bool disposing) above. 
    // Dispose(false); 
    // } 

    // This code added to correctly implement the disposable pattern. 
    void IDisposable.Dispose() 
    { 
     // Do not change this code. Put cleanup code in Dispose(bool disposing) above. 
     Dispose(true); 
     // TODO: uncomment the following line if the finalizer is overridden above. 
     // GC.SuppressFinalize(this); 
    } 
    #endregion 
} 

それを機能させるために追加する必要があるものは何ですか?それは可能か、私のアプローチを変える必要がありますか?

+0

500は、内部サーバーエラーです。ちょうどF5(デバッグから始まる)を押して、何が例外であるかを見てください。あなたのアプローチは正しいものであり、働かない理由はありません。 – regnauld

+0

デバッガはプログラムクラスとスタートアップクラスに当てられますが、コントローラコンストラクタには当てはまりません。同じページを表示してリフレッシュします。 –

+0

私たちが全力を尽くした占い技を使わずにお手伝いすることを期待する場合は、より多くの情報を提供する必要があります。コントローラの内容を投稿しただけですが、 'EntriesService'はどうでしょうか? – Tseng

答えて

3

すべての依存関係を構成ルートに登録して、正しい生涯で登録する必要があります。つまり、将来の問題を避けるために:(ScopedTransientSingleton)です。

public void ConfigureServices(IServiceCollection services) { 
    // Add framework services. 
    services.AddMvc(); 

    services.AddSingleton<IEntriesService, EntriesService>(); 
    services.AddTransient<IUnitOfWork, UnitOfWork>(); 
    services.AddTransient<IEntriesRepository, EntriesRepository>(); 
    services.AddSingleton<IConnectionFactory, ConnectionFactory>(); 

    //...add other dependencies. 
} 

いくつかの時間を取り、ドキュメントをチェックアウト:

Introduction to Dependency Injection in ASP.NET Core

関連する問題