如何将自定义dbcontext(审核日志)与sharprepository

时间:2016-03-15 08:54:05

标签: dbcontext sharp-repository tracker-enabled-dbcontext

我有一个自定义dbcontext,其名称是启用了跟踪器的DbContext(https://github.com/bilal-fazlani/tracker-enabled-dbcontext)。我想将它用于审计日志

我该如何实现EFRepository?

我实现了启用跟踪器的上下文,但我无法解决如何覆盖锐利的repo commit方法。

public class HayEntities : TrackerContext
   {
    static HayEntities()
    {
      Database.SetInitializer<HayEntities>(null);
    }
    public HayEntities() : base(HayEntities)
    {
      this.Configuration.ProxyCreationEnabled = false;
      this.Configuration.LazyLoadingEnabled = true;
      this.Configuration.ValidateOnSaveEnabled = false;
    }
    public DbSet<Dummy> Dummys{ get; set; }  
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.Configurations.Add(new DummyConfiguration());

    } }
  }
 public class DummyRepository : ConfigurationBasedRepository<DE.Dummy, long>, IDummyRepository
    {
        private readonly IRepository<DE.Dummy, long> _servisHasarRepository;
        public DummyRepository (HayEntities hayEntities,    ICachingStrategy<DE.Dummy, long> cachingStrategy = null)
        {this.CachingEnabled = false;
            _dummyRepository = new EfRepository<DE.Dummy, long>(hayEntities, cachingStrategy);
        }
public void UpdateOrCreate() {
 //In this area how can override save/commit method
}
  } 

1 个答案:

答案 0 :(得分:0)

您需要告诉SharpRepository使用IoC提供程序注入DbContext。这将负责为您的EfRepository获取正确的DbContext。

如果您想根据配置控制事物并拥有自定义存储库,那么您可以实现自己的方法,如UpdateOrCreate(),那么您将继承ConfigurationBasedRepository,就像您在示例中一样。

有关使用SharpRepository设置IoC的更多详细信息:http://fairwaytech.com/2013/02/sharprepository-configuration/(请参阅“实体框架并共享DbContext”部分)

首先查看NuGet for SharpRepository.Ioc。*以查找您正在使用的特定IoC。如果你正在使用StructureMap,那么你会做这样的事情。

在StructureMap配置中:

// Hybrid (once per thread or ASP.NET request if you’re in a web application)
For<DbContext>()
    .HybridHttpOrThreadLocalScoped()
    .Use<HayEntities>()
    .Ctor<string>("connectionString").Is(entityConnectionString);

然后你需要通过在启动代码中调用它来告诉SharpRepository使用StructureMap:

RepositoryDependencyResolver.SetDependencyResolver(new StructureMapDependencyResolver(ObjectFactory.Container));

完成这些操作后,如果您使用EfRepository,那么它会知道向StructureMap询问DbContext。

现在在您上面使用ConfigurationBasedRepository的示例中,我建议在配置文件而不是代码中设置缓存,因为您使用配置来加载存储库。由于IoC正在处理DbContext,因此您不需要对其进行任何操作,您可以专注于要编写的自定义方法。

public class DummyRepository : ConfigurationBasedRepository<DE.Dummy, long>, IDummyRepository
{
    public void UpdateOrCreate()
    {
        // You have access to the underlying IRepository<> which is going to be an EfRepository in your case assuming you did that in the config file
        // here you can call Repository.Add(), or Reposiory.Find(), etc.
    }
}