2016-12-22 2 views
0

Метод действия контроллера не вызывается при использовании конструктора.Метод действия контроллера, не вызываемый при использовании инъекции зависимостей в asp.net core web api

Это класс запуска.

public class Startup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
      .AddEnvironmentVariables(); 
     Configuration = builder.Build(); 
    } 

    public IConfigurationRoot Configuration { get; } 

    // This method gets called by the runtime. Use this method to add services to the container. 
    public void ConfigureServices(IServiceCollection services) 
    { 

     var connection = Configuration.GetConnectionString("DefaultConnection"); 
     services.AddDbContext<EmakitiContext>(options => options.UseSqlServer(connection)); 

     // Add framework services. 
     services.AddMvc(); 
     services.AddTransient<IMarketUOW<EmakitiContext>, MarketUow<EmakitiContext>>(); 
    } 

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 
    } 
} 

Когда я добавил конструктор на HomeController метод действий не был called.However, если удалить конструктор, то метод действия будет называться. То, что я делаю неправильно, я не могу понять.

Вот контроллер

[Route("api/[controller]/[Action]")] 
    public class HomeController : Controller 
    { 

     private readonly IMarketUOW<EmakitiContext> _iMarketUow; 

     public HomeController(IMarketUOW<EmakitiContext> iMarketUow) 
     { 
      _iMarketUow = iMarketUow; 
     } 

     [HttpGet] 
     public GenericResponseObject<List<MarketViewModel>> GetMarketList() 
     { 
      GenericResponseObject<List<MarketViewModel>> genericResponseObject = new GenericResponseObject<List<MarketViewModel>>(); 
      genericResponseObject.IsSuccess = false; 
      genericResponseObject.Message = ConstaintStingValue.Tag_ConnectionFailed; 
      try 
      { 
       genericResponseObject.Data = _iMarketUow.GetMarketList(); 
       genericResponseObject.IsSuccess = true; 
       genericResponseObject.Message = ConstaintStingValue.Tag_ConnectionSuccess; 
      } 
      catch (Exception exception) 
      { 

      } 
      return genericResponseObject; 
     } 


    } 
} 

Вот интерфейс рынка Класс

public interface IMarketUOW<C> where C: DbContext 
    { 
     List<MarketViewModel> GetMarketList(); 
    } 

Вот это marketuow реализовать класс

public class MarketUow<C> : IMarketUOW<C> where C : DbContext 
    { 

     private readonly IGenericRepository<C, Market> _iGenericRepository; 

     public MarketUow(IGenericRepository<C, Market> iGenericRepository) 
     { 
      _iGenericRepository = iGenericRepository; 
     } 

     public List<MarketViewModel> GetMarketList() 
     { 
      List<MarketViewModel> listMarket = new List<MarketViewModel>(); 
      var databaseList = _iGenericRepository.GetAll().ToList(); 
      databaseList.ForEach(m => listMarket.Add(new MarketViewModel 
      { 
       MarketId = m.MarketId, 
       City = m.City, 
       CityF = m.CityF, 
       IsActive = m.IsActive, 
       Name = m.Name, 
       NameF = m.NameF, 
       SortOrder = m.SortOrder 
      })); 
      return listMarket; 

     } 

    } 

Вот код Generic Interface

public interface IGenericRepository<C,T> where C: DbContext where T : class 
    { 
     IQueryable<T> GetAll(); 
     IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate); 

     void Add(T entity); 
     void Delete(T entity); 
     void Edit(T entity); 
     void Save(); 

    } 

Вот Generic классом реализации

public abstract class GenericRepository<C,T> : IGenericRepository<C, T> where T: class where C: DbContext, new() 
    { 
     private C _entities =new C(); 
     public C Context 
     { 

      get { return _entities; } 
      set { _entities = value; } 
     }  

     public virtual IQueryable<T> GetAll() 
     { 

      IQueryable<T> query = _entities.Set<T>(); 
      return query; 
     } 

     public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate) 
     { 

      IQueryable<T> query = _entities.Set<T>().Where(predicate); 
      return query; 
     } 

     public virtual void Add(T entity) 
     { 
      _entities.Set<T>().Add(entity); 
     } 

     public virtual void Delete(T entity) 
     { 
      _entities.Set<T>().Remove(entity); 
     } 

     public virtual void Edit(T entity) 
     { 
      _entities.Entry(entity).State = EntityState.Modified; 
     } 

     public virtual void Save() 
     { 
      _entities.SaveChanges(); 
     } 
    } 
+0

Пожалуйста, добавьте шаблон класса «MarketUow». – Ahmar

+0

@Ahmar - Я обновил полный код. Пожалуйста, дайте мне знать –

ответ

2

Home контроллер только инициализацию, когда его все зависимость выполнения. Зависимость Injunction пытается создать экземпляр MarketUow, который зависит от GenericRepository. Затем он пытается создать экземпляр, но не способен это сделать, потому что это абстрактный класс.

Добавить это в запуске

services.AddTransient< IGenericRepository< EmakitiContext,Market>, GenericRepository<EmakitiContext, Market>>(); 
services.AddTransient<IMarketUOW<EmakitiContext>, MarketUow<EmakitiContext>>(); 

и удалить абстрактный модификатор из GenericRepository и он будет работать.

0

Вы на самом деле не хватает, чтобы сказать, как управлять инъекции зависимостей для IMarketUOW<EmakitiContext> интерфейса.

В Startup.cs в ConfigureServices нужно добавить:

services.AddTransient<IMarketUOW, MarketUow>(); 
services.AddScoped(typeof(IMarketUOW<>), typeof(MarketUow<>)); 
+0

Я добавил в startup.cs, но все та же проблема –

+0

Как вы сказали, что без контроллера он работал, я уверен, что это проблема с инъекцией зависимостей, и ASP не знает, как создать экземпляр вашего контроллера с параметром , У меня будет более близкий взгляд – Piou

+0

Я обновил файл startup.cs, пожалуйста, дайте мне знать –

Смежные вопросы