0

Я разработал веб-Апи, которые взаимодействуют с сервером SQL с помощью Entity Framwork в структуре ниже:Не удалось зарегистрировать Autofac для структуры проекта

Хранилища (содержит все repostory классы) - Интерфейс

public interface IRepository<TEntity> where TEntity : IEntity 
    { 
     Task<TEntity> GetAllAsync(int id); 
    } 

- Абстрактный класс

public abstract class GenericRepository<TEntity> : IGenericRepository<TEntity> 
    where TEntity : BaseEntity 
    { 
     protected readonly DbContext dbContext; 


     protected IDbSet<TEntity> _dbEntitySet = null; 
     private bool _disposed; 

     public GenericRepository(DbContext dbContext) 
     { 
      this.dbContext = dbContext; 
      _dbEntitySet = dbContext.Set<TEntity>(); 
     } 


     public async Task<List<TEntity>> GetAllAsync() 
     { 
      return await _dbEntitySet.ToListAsync(); 
     } 

ConsumerCLass

public class ConsumerCLassRepository : GenericRepository<CustomerModel> 
    { 
     public ConsumerCLassRepository() 
      : base(new ApplicationDbContext()) 
     { 
     } 
    } 

--DbCOntext - Interace

открытый интерфейс IDbContext: IDisposable { IDbSet Set(), где TEntity: BaseEntity; }

**** Абстрактный класс ****

public class AbstractDbContext : DbContext, IDbContext 
    { 
     protected ObjectContext _objectContext; 
     protected DbTransaction _transaction; 
     protected static readonly object Lock = new object(); 
     protected static bool _databaseInitialized; 

     public AbstractDbContext(string connectionStringName) 
      : base(string.Format("name={0}", connectionStringName)) 
     { 

     } 
     public new IDbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity 
     { 
      return base.Set<TEntity>(); 
     } 
} 

--COncrete DbContext

public class ApplicationDbContext: AbstractDbContext 
    { 
     public ApplicationDbContext() 
      : base("ApplicationContext") 
     { 
      Database.SetInitializer<ApplicationDbContext>(null); 
     } 

     #region DbSets 
     public virtual DbSet<LogRelay> LogRelay{ get; set; } 
     #EndRegion 
    } 

Все выше код принадлежит репозиториев проекта

Далее идут услуги проекта: Интерфейс

public interface IService<TOutput> 
    where TOutput : class, new() 
{ 
    Task<List<TOutput>> GetAllAsync(dynamic inputParameter); 
} 

**** Класс бетона ****

public class CustomerSiteDirectoryService : IService<InputModel> 
    { 
     private readonly IGenericRepository<GetCustomerSiteStatus_Result> repository; 
     public CustomerSiteDirectoryService(IGenericRepository<GetCustomerSiteStatus_Result> repository) 
     { 
      this.repository = repository; 
     } 

     public async Task<List<InputModel>> GetAllAsync(dynamic inputParameter) 
     { 
     return something; 
     } 
} 

CONTROLLER:

public class MyApiController: ApiController 
    { 
     private readonly IService<InputModel> _cosumerService = null; 
     public MyApiController(IService<InputModel> _cosumerService) 
     { 
      _customerService = customerService; 
     } 

     public async Task<IHttpActionResult> GetMap() 
     { 
      var details= await _customerService.GetAllAsync(new Input()); 
      return Ok(details) 
     } 
} 

Autofac конфигурации:

private static void SetAutofacWebAPIServices(HttpConfiguration configuration) 
     { 
      var builder = new ContainerBuilder(); 
      // Register API controllers using assembly scanning. 
      builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

      builder.RegisterGeneric(typeof(GenericRepository<>)) 
      .As(typeof(IGenericRepository<>)) 
      .InstancePerLifetimeScope(); 

      builder.RegisterAssemblyTypes(typeof(AbstractDbContext) 
      .Assembly).Where(t => t.Name.EndsWith("DbContext")) 
      .InstancePerLifetimeScope(); 

      builder.RegisterAssemblyTypes(typeof(AuthRepository) 
       .Assembly).Where(t => t.Name.EndsWith("Repository")) 
      .InstancePerLifetimeScope(); 

      builder.RegisterAssemblyTypes(Assembly.Load("Services")) 
      .Where(t => t.Name.EndsWith("Service")) 
     .AsImplementedInterfaces() 
     .InstancePerLifetimeScope(); 



     var container = builder.Build(); 
     // Set the dependency resolver implementation. 
     var resolver = new AutofacWebApiDependencyResolver(container); 
     configuration.DependencyResolver = resolver; 
    } 

}

Теперь, когда я запустить приложение я получаю сообщение об ошибке

<Error> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
An error occurred when trying to create a controller of type 'MyApiController'. Make sure that the controller has a parameterless public constructor. 
</ExceptionMessage> 
<ExceptionType>System.InvalidOperationException</ExceptionType> 
<StackTrace> 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext() 
</StackTrace> 
<InnerException> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'MyAPp.API.Controllers.MyApiController' can be invoked with the available services and parameters: Cannot resolve parameter 'MyAPp.Services.IService`1[MyAPp.Models.InputModel] cusumerService' of constructor 'Void .ctor(MyAPp.Services.IService`1[MyAPp.Models.InputModel])'. 
</ExceptionMessage> 
<ExceptionType>Autofac.Core.DependencyResolutionException</ExceptionType> 
<StackTrace> 
at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) at Autofac.Core.Resolving.InstanceLookup.Execute() at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters) at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters) at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType, IEnumerable`1 parameters) at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType) at Autofac.Integration.WebApi.AutofacWebApiDependencyScope.GetService(Type serviceType) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
</StackTrace> 
</InnerException> 
</Error> 

Пожалуйста, помогите мне с конфиге Autofac, кажется, есть некоторые проблемы с autofac конфигурации, и я не могу понять ,

+0

Вы только IService реализован, но MyApiController просит IService . Что такое InputModel? –

+0

MyApiController не имеет конструктора без параметров. – yyou

+0

@ StephenZeng hey sorry abt, что это была опечатка, исправлено, что .. – Dreamweaver

ответ

0
builder.RegisterAssemblyTypes(Assembly.Load("Services")) 
    .Where(t => t.Name.EndsWith("Service")) 

Должен быть изменен на

builder.RegisterAssemblyTypes(typeof(IService<>).Assembly) 
    .Where(t => t.Name.EndsWith("Service")) 
    .AsClosedTypesOf(typeof (IService<>)); 
+0

обновит вас после попытки .. :) – Dreamweaver

+0

все та же ошибка :( – Dreamweaver

+0

@ Dreamweaver Он должен работать, попытайтесь изменить его на build.RegisterAssemblyTypes (typeof (IService <>). Assembly)? –