次のようなインターフェイスとその実装を含むIDataRepository.csファイルがあります。
public interface IDataRepository<TEntity, U> where TEntity : class
{
IEnumerable<TEntity> GetAll();
TEntity Get(U id);
TEntity GetByString(string stringValue);
long Add(TEntity b);
long Update(U id, TEntity b);
long Delete(U id);
}
IDataRepositoryインターフェイスを実装する別のクラスTokenManager.csがあります。
public class TokenManager : IDataRepository<Token, long>
{
ApplicationContext ctx;
public TokenManager(ApplicationContext c)
{
ctx = c;
}
//Get the Token Information by ID
public Token Get(long id)
{
var token = ctx.Token.FirstOrDefault(b => b.TokenId == id);
return token;
}
public IEnumerable<Token> GetAll()
{
var token = ctx.Token.ToList();
return token;
}
//Get the Token Information by ID
public Token GetByString(string clientType)
{
var token = ctx.Token.FirstOrDefault(b => b.TokenClientType == clientType);
return token;
}
public long Add(Token token)
{
ctx.Token.Add(token);
long tokenID = ctx.SaveChanges();
return tokenID;
}
}
最後に、すべてのものを組み合わせるコントローラーがあり、コントローラーファイルは次のようになります。
[Route("api/[controller]")]
public class TokenController : Controller
{
private IDataRepository<Token, long> _iRepo;
public TokenController(IDataRepository<Token, long> repo)
{
_iRepo = repo;
}
// GET: api/values
[HttpGet]
public IEnumerable<Token> Get()
{
return _iRepo.GetAll();
}
// GET api/values/produccion
[HttpGet("{stringValue}")]
public Token Get(string stringValue)
{
return _iRepo.GetByString(stringValue);
}
}
しかし問題は、たとえばpostmanを使用して、APIからいくつかのメソッドにアクセスしようとするたびにエラーが発生することです。
InvalidOperationException:アクティブ化しようとしているときに、タイプFECR_API.Models.Repository.IDataRepository`2 [FECR_API.Models.Token、System.Int64]のサービスを解決できません; FECR_API.Controllers.TokenController
ConfigureServices内でこのようなものを使用しようとしましたが、変換エラーが発生しました
services.AddScoped<IDataRepository, TokenManager>();
私が間違っていることは何か考えていますか?
依存関係をStartup.cs
内のDIコンテナに登録してください
public class Startup
{
...
public void ConfigureServices(IServiceCollection services)
{
...
services.AddScoped<IDataRepository<Token, long>, TokenManager>();
...
}
}