在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] 删除。
我来说两句