0

ich eine Web-Api entworfen haben, die mit SQL Server mit dem Entity Framwork in folgenden Struktur interagieren:kann nicht Autofac für die Projektstruktur registrieren

Repositorys (enthält alle repostory Klassen) - Schnittstelle

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

- Abstrakte Klasse

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

öffentliche Schnittstelle IDbContext: IDisposable { IDbSet Set(), wo TEntity: BaseEntity; }

**** Abstrakte Klasse ****

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 
    } 

Alle obigen Code gehört zu Repositories Projekt

Als nächstes kommt Dienste Projekt: Schnittstelle

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

**** Betonklasse ****

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 Konfiguration:

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; 
    } 

}

Nun, wenn ich die Anwendung ausführen bekomme ich einen Fehler

<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> 

Bitte helfen Sie mir mit dem Autofac Config scheint es einige Probleme mit Autofac Config zu sein, und ich bin nicht in der Lage zu verstehen, .

+0

Sie nur IService implementiert haben geändert werden, aber MyApiController fragt nach einem IService . Was ist InputModel? –

+0

MyApiController hat keinen parameterlosen Konstruktor. – yyou

+0

@StephenZeng hey es tut mir leid, dass, es war Tippfehler, korrigiert, dass .. – Dreamweaver

Antwort

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

Sollte auf

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

wird Sie nach dem Versuch aktualisieren .. :) – Dreamweaver

+0

immer noch gleichen Fehler :( – Dreamweaver

+0

@ Dreamweaver Es sollte funktionieren, versuchen Sie, es in build.RegisterAssemblyTypes (typeof (IService <>). Assembly) zu ändern? –