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, .
Sie nur IService implementiert haben geändert werden, aber MyApiController fragt nach einem IService . Was ist InputModel? –
MyApiController hat keinen parameterlosen Konstruktor. – yyou
@StephenZeng hey es tut mir leid, dass, es war Tippfehler, korrigiert, dass .. – Dreamweaver