簡體   English   中英

如何在AutoFac中注冊配置文件AutoMapper?

[英]How to register profile AutoMapper in AutoFac?

我在WebApi項目中使用AutoFac和AutoMapper。 使用Post and Put操作時,會出現很多錯誤。 例如:

{
  "Message": "An error has occurred.",
  "ExceptionMessage": "An entity object cannot be referenced by multiple instances of IEntityChangeTracker.",
  "ExceptionType": "System.InvalidOperationException",
  "StackTrace": "System.Data.Entity.Core.Objects.ObjectContext.VerifyContextForAddOrAttach(IEntityWrapper wrappedEntity)
                 System.Data.Entity.Core.Objects.ObjectContext.AddSingleObject(EntitySet entitySet, IEntityWrapper wrappedEntity, String argumentName)
                 System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.AddEntityToObjectStateManager(IEntityWrapper wrappedEntity, Boolean doAttach)
                 System.Data.Entity.Core.Objects.DataClasses.EntityReference.AddEntityToObjectStateManager(IEntityWrapper wrappedEntity, Boolean doAttach)
                 System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.AddGraphToObjectStateManager(IEntityWrapper wrappedEntity, Boolean relationshipAlreadyExists, Boolean addRelationshipAsUnchanged, Boolean doAttach)
                 System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
                 System.Data.Entity.Core.Objects.DataClasses.EntityReference`1.Include(Boolean addRelationshipAsUnchanged, Boolean doAttach)
                 System.Data.Entity.Core.Objects.DataClasses.RelationshipManager.AddRelatedEntitiesToObjectStateManager(Boolean doAttach)
                 System.Data.Entity.Core.Objects.ObjectContext.AddObject(String entitySetName, Object entity)
                 System.Data.Entity.Internal.Linq.InternalSet`1.<>c__DisplayClassd.<Add>b__c()
                 System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
                 System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
                 System.Data.Entity.DbSet`1.Add(TEntity entity)
                 ProjektSH.DataAccess.Repository`1.Add(T model) w C:\\ProjektyVS\\ProjektSH\\ProjektSH.Web\\ProjektSH.DataAccess\\Repository.cs:wiersz 21
                 ProjektSH.Logic.Products.ProductLogic.Create(Product product) w C:\\ProjektyVS\\ProjektSH\\ProjektSH.Web\\ProjektSH.Logic\\Products\\ProductLogic.cs:wiersz 37
                 ProjektSH.Web.ApiControllers.ProductController.Create(CreateProductDTO createProductDto) w C:\\ProjektyVS\\ProjektSH\\ProjektSH.Web\\ProjektSH.Web\\ApiControllers\\ProductController.cs:wiersz 52
                 lambda_method(Closure , Object , Object[] )
                 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass6_2.<GetExecutor>b__2(Object instance, Object[] methodParameters)
                 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
                 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
                 --- Koniec sladu stosu z poprzedniej lokalizacji, w której wystapil wyjatek ---
                 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
                 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
                 System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext()
                 --- Koniec sladu stosu z poprzedniej lokalizacji, w której wystapil wyjatek ---
                 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
                 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
                 System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext()
                 --- Koniec sladu stosu z poprzedniej lokalizacji, w której wystapil wyjatek ---
                 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
                 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
                 System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()"
}

我使用此AutoFac配置:

    public class AutoFacConfig
    {
        public static AutofacDependencyResolver Resolver;
        public static AutofacWebApiDependencyResolver ApiResolver;
        public static IContainer Container;

        public static void Configure()
        {
            var builder = new ContainerBuilder();
            builder.RegisterAssemblyModules(typeof(AutoFacConfig).Assembly);
            var container = builder.Build();
            Container = container;
            Resolver = new AutofacDependencyResolver(container);
            ApiResolver = new AutofacWebApiDependencyResolver(container);
            DependencyResolver.SetResolver(Resolver);
            GlobalConfiguration.Configuration.DependencyResolver = ApiResolver;
        }
    }

因此,我注冊了個人資料:

    protected override void Load(ContainerBuilder builder)
    {
        base.Load(builder);
        var profiles = GetType().Assembly.GetTypes()
                                .Where(t => typeof(Profile).IsAssignableFrom(t))
                                .Select(t => (Profile) Activator.CreateInstance(t));

        builder.Register(ctx => new MapperConfiguration(cfg =>
        {
            cfg.ConstructServicesUsing(t => AutoFacConfig.Container.Resolve(t));
            foreach (var profile in profiles)
            {
                cfg.AddProfile(profile);
            }
        }));

        builder.Register(ctx => ctx.Resolve<MapperConfiguration>()
               .CreateMapper()).As<IMapper>();
    }

存儲庫產品添加:

        public virtual void Add(T model)
        {
            DataContext.Set<T>().Add(model);
        }

產品邏輯創建

        public Result<Product> Create(Product product)
        {
            if(product == null)
            {
                throw new ArgumentException(nameof(product));
            }
            var validatorResult = Validator.Validate(product);
            if (validatorResult.IsValid == false)
            {
                return Result.Failure<Product>(validatorResult.Errors);
            }
            Repository.Add(product);
            Repository.SaveChanges();
            return Result.Ok(product);
        }

錯誤有所不同,或者沒有檢測到配置文件或未注冊配置文件,因此它使其他類加倍。 我該如何解決這個錯誤?

這條線解決了我的問題

        public virtual T GetById(int id)
        {
            return DataContext.Set<T>().AsNoTracking().FirstOrDefault(m => m.Id == id);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM