update

28810
2019-03-12 15:39:03 +08:00
parent 76b10671b1
commit a8cce817a5
3 changed files with 85 additions and 7 deletions

@@ -50,14 +50,23 @@ public IServiceProvider ConfigureServices(IServiceCollection services) {
var builder = new ContainerBuilder();
//示范全局过滤的仓储类注入,如果实体中不存在 Title 属性,则条件不生效
builder.RegisterFreeRepositoryAddFilter<Song>(() => a => a.Title == DateTime.Now.ToString() + System.Threading.Thread.CurrentThread.ManagedThreadId);
builder.RegisterFreeRepository(filter =>
filter.Apply<Song>("test", a => a.Title == DateTime.Now.ToString() + Thread.CurrentThread.ManagedThreadId)
);
builder.Populate(services);
var container = builder.Build();
return new AutofacServiceProvider(container);
}
public class xxxx {
public int Id { get; set; }
}
public class Song {
[Column(IsIdentity = true)]
public int Id { get; set; }
public string Title { get; set; }
}
//在控制器使用
public SongsController(GuidRepository<Song> repos1, GuidRepository<xxxx> repos2) {
}
@@ -65,6 +74,34 @@ public SongsController(GuidRepository<Song> repos1, GuidRepository<xxxx> repos2)
> Autofac 注入方式实现了全局【过滤与验证】的设定,方便租户功能的设计;
第一次请求:
repos1.Select.ToSql()
> "SELECT a."Id", a."Title" \r\nFROM "Song" a \r\nWHERE (a."Title" = strftime('%Y-%m-%d %H:%M.%f',datetime(current_timestamp,'localtime')) || 21)"
repos2.Select.ToSql()
>"SELECT a."Id" \r\nFROM "xxxx" a"
第二次请求:
repos1.Select.ToSql()
>"SELECT a."Id", a."Title" \r\nFROM "Song" a \r\nWHERE (a."Title" = strftime('%Y-%m-%d %H:%M.%f',datetime(current_timestamp,'localtime')) || 4)"
repos2.Select.ToSql()
>"SELECT a."Id" \r\nFROM "xxxx" a"
//禁用过滤器
repos1.DataFilter.Disable("test")
repos1.Select.ToSql()
> "SELECT a."Id", a."Title" \r\nFROM "Song" a"
1、注入的变量值在使用时有了动态变化每次获取时都是新的Thread.CurrentThread.ManagedThreadId
2、设定的全局过滤若某实体不存在表达式函数中的字段时不会生效如上xxxx不存在Title
3、使用 DataFilter.Disable("test") 可临时关闭过滤器的效果,使用 DataFilter.Enable("test") 可重新开启;
## 过滤与验证
假设我们有User(用户)、Topic(主题)两个实体,在领域类中定义了两个仓储:

@@ -1,6 +1,10 @@
完整版本:年数-月-日-当日版本号FreeSql 与 FreeSql.Repository 版本号相同。
## v0.3.13
- 修改 FreeSql.Repository Autofac 注入方式,真正的实现全局过滤功能;
## v0.3.12
- 增加 ICodeFirst.IsConfigEntityFromDbFirst若无配置实体类主键、自增可从数据库导入

@@ -62,7 +62,7 @@ LEFT JOIN "TopicType_1" b ON a."TypeId" = b."Id"
### 实现全局控制租户
FreeSql.Repository Autofac 注入方式实现了全局【过滤与验证】、【分表分库】的设定,方便租户功能的设计;
FreeSql.Repository Autofac 注入方式实现了全局【过滤与验证】的设定,方便租户功能的设计;
```csharp
public IServiceProvider ConfigureServices(IServiceCollection services) {
@@ -72,21 +72,58 @@ public IServiceProvider ConfigureServices(IServiceCollection services) {
var builder = new ContainerBuilder();
//这里示范全局过滤的仓储类注入,如果实体中不存在 Title 属性,则条件不生效
builder.RegisterFreeRepositoryAddFilter<Song>(() => a => a.Title == DateTime.Now.ToString() + System.Threading.Thread.CurrentThread.ManagedThreadId);
//示范全局过滤的仓储类注入,如果实体中不存在 Title 属性,则条件不生效
builder.RegisterFreeRepository(filter =>
filter.Apply<Song>("test", a => a.Title == DateTime.Now.ToString() + Thread.CurrentThread.ManagedThreadId)
);
builder.Populate(services);
var container = builder.Build();
return new AutofacServiceProvider(container);
}
public class xxxx {
public int Id { get; set; }
}
public class Song {
[Column(IsIdentity = true)]
public int Id { get; set; }
public string Title { get; set; }
}
//在控制器使用
public SongsController(GuidRepository<Song> repos1, GuidRepository<xxxx> repos2) {
//repos1, repos2 都会附带注入时的 Filter 规则;
}
```
第一次请求:
repos1.Select.ToSql()
> "SELECT a."Id", a."Title" \r\nFROM "Song" a \r\nWHERE (a."Title" = strftime('%Y-%m-%d %H:%M.%f',datetime(current_timestamp,'localtime')) || 21)"
repos2.Select.ToSql()
>"SELECT a."Id" \r\nFROM "xxxx" a"
第二次请求:
repos1.Select.ToSql()
>"SELECT a."Id", a."Title" \r\nFROM "Song" a \r\nWHERE (a."Title" = strftime('%Y-%m-%d %H:%M.%f',datetime(current_timestamp,'localtime')) || 4)"
repos2.Select.ToSql()
>"SELECT a."Id" \r\nFROM "xxxx" a"
//禁用过滤器
repos1.DataFilter.Disable("test")
repos1.Select.ToSql()
> "SELECT a."Id", a."Title" \r\nFROM "Song" a"
1、注入的变量值在使用时有了动态变化每次获取时都是新的Thread.CurrentThread.ManagedThreadId
2、设定的全局过滤若某实体不存在表达式函数中的字段时不会生效如上xxxx不存在Title
3、使用 DataFilter.Disable("test") 可临时关闭过滤器的效果,使用 DataFilter.Enable("test") 可重新开启;
```
## 参考资料
- [《读写分离》](https://github.com/2881099/FreeSql/wiki/%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb)