带有Web API的Autofac的EF依赖项注入

提姆

在DbContext中保存实体时,我动态注入了客房服务。

protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
{
    var t = entityEntry.Entity.GetType();

    // Housekeep
    var castEntityEntry = castDbEntityEntryMethod
        .MakeGenericMethod(new[] { t })
        .Invoke(entityEntry, null);
    housekeepEntityMethod
        .MakeGenericMethod(new[] { t })
        .Invoke(this, new[] { castEntityEntry });

    return base.ValidateEntity(entityEntry, items);
}

private void HousekeepEntity<TEntity>(DbEntityEntry<TEntity> entity)
    where TEntity : class
{
    var housekeeper = DbConfiguration.DependencyResolver.GetService<IHousekeeper<TEntity>>();
    if (housekeeper != null)
    {
        housekeeper.Maintain(entity);
    }
}

IComponentContext到处都是遍历,所以我可以在那里解析类型,但是有了EF6,我希望使用依赖注入:

private class AutofacDbDependencyResolver : AutofacWebApiDependencyResolver, IDbDependencyResolver
{
    public AutofacDbDependencyResolver(ILifetimeScope container)
        : base(container)
    {
    }

    public object GetService(System.Type type, object key)
    {
        using (var scope = this.GetRequestLifetimeScope())
        {
            if (scope == null)
            {
                return null;
            }

            object service;
            scope.TryResolve(type, out service);
            return service;
        }
    }

    public System.Collections.Generic.IEnumerable<object> GetServices(System.Type type, object key)
    {
        using (var scope = this.GetRequestLifetimeScope())
        {
            if (scope == null)
            {
                return System.Linq.Enumerable.Empty<object>();
            }

            object service;
            if (scope.TryResolve(type, out service))
            {
                return new object[] { service };
            }
            else
            {
                return System.Linq.Enumerable.Empty<object>();
            }
        }
    }
}

设置容器时:

System.Data.Entity.DbConfiguration.Loaded += (s, e) =>
    e.AddDependencyResolver(new AutofacDbDependencyResolver(container), overrideConfigFile: false);

但是,我的生存期范围返回null。如何获得调用此操作的当前API请求?

史蒂文

禁止在DbContext中使用服务定位器反模式EF6现在允许您解决它并不重要,它仍然是反模式。取而代之的是简单地使用依赖项注入,或者通过挂接到事件上来添加此内务处理。例如,您可以为实体编写局部类:

public partial class MyEntities
{
    public event Action<DbContext> SavingChanges = _ => { };

    public override int SaveChanges()
    {
        this.SavingChanges(this);

        return base.SaveChanges();
    }
}

这样,您可以简单地挂接在SavingChanges有人致电时将引发事件SaveChanges

builder.Register<MyEntities>(context =>
{
    var db = new MyEntities();
    db.SavingChanges += context.Resolve<IHouseKeepingService>().HousekeepEntities;
    return db;
}).InstancePerLifetimeScope();    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Web API的Autofac:从HttpRequestMessage注入依赖项吗?

来自分类常见问题

带有依赖项注入的EF核心DbContext

来自分类Dev

带有依赖项注入的EF核心DbContext

来自分类Dev

依赖项注入不适用于Owin自托管Web Api 2和Autofac

来自分类Dev

带有依赖项注入的Hangfire RecurringJob

来自分类Dev

带有可变对象的依赖项注入

来自分类Dev

带有ninject的依赖项注入RoleStore

来自分类Dev

Web API Nunit测试未注入依赖项

来自分类Dev

Web API Nunit测试未注入依赖项

来自分类Dev

具有存储库模式和依赖项注入的C#(Autofac)

来自分类Dev

具有存储库模式和依赖项注入的C#(Autofac)

来自分类Dev

具有全局Web API过滤器属性的Unity依赖项注入

来自分类Dev

带有Ninject的.NET MVC依赖项注入

来自分类Dev

带有分层视图模型的Unity的MVVM依赖项注入

来自分类Dev

带有WebAPI的Microsoft Unity依赖项注入

来自分类Dev

带有Castle DynamicProxy的.NET Core默认依赖项注入

来自分类Dev

带有Ninject的SignalR已停止注入集线器依赖项

来自分类Dev

如何在具有AutoFac的Umbraco 7控制器中通过依赖项注入使用IMediator(MediatR)?

来自分类Dev

Web Api 2:带有内容的NotFound()?

来自分类Dev

带有Web API的Ajax Jquery请求

来自分类Dev

带有Java API的Node Web App

来自分类Dev

带有警告的Web API方法

来自分类Dev

带有 Unity 的 Web Api OWIN 主机

来自分类Dev

带有 web.py 的 Restful API

来自分类Dev

动态依赖注入Web API

来自分类Dev

动态依赖注入Web API

来自分类Dev

使用http作用域实例通过StructureMap进行Web Api和依赖项注入

来自分类Dev

在Web API 2中将Ninject依赖项注入WebApiConfig

来自分类Dev

使用ASP.NET Web API 2.1配置依赖项注入

Related 相关文章

热门标签

归档