创建多个仓储库Repository

如题:

 

首先部署svn服务,比如我把服务器上的 F:\svnhome作为svn根目录:

 

1. cmd 命令创建svn server的服务(Win7下必须用管理员权限打开cmd):

 

sc create svnserver binpath= "C:\Program Files\TortoiseSVN\bin\svnserve.exe --service -r F:\svnhome" displayname= "SVN Server" depend= Tcpip start= auto

 2. 到windows服务管理中确保刚才新创建的服务处于开启状态:

 


       

3. 然后,在 F:\svnhome下创建两个仓储库:

svnadmin create F:\svnhome\SVN1
svnadmin create F:\svnhome\SVN2
 

 

4. 此时这个两个svn repository就可以独立运行、设置用户全乡等等了,访问地址分别为:

svn://localhost/svn1 (远程访问把localhost换成server的ip。。)

svn://localhost/svn2

### 使用 SqlSugar 实现分仓储模式 为了实现分功能,在 `SqlSugar` 中可以通过配置多个数据连接并动态切换来完成。下面是一个简单的例子,展示如何通过定义不同的数据上下文以及相应的仓储类来支持多操作。 #### 创建不同数据的连接配置 首先创建两个独立的数据源链接设置: ```csharp public class ConnectionConfigA : ConnectionConfig { public ConnectionConfigA() { DbType = DbType.SqlServer; ConnectionString = "Data Source=server1;Initial Catalog=db1;User ID=user;Password=password"; InitKeyType = InitKeyType.Attribute; } } public class ConnectionConfigB : ConnectionConfig { public ConnectionConfigB() { DbType = DbType.MySql; ConnectionString = "Server=localhost;Database=db2;charset=utf8;Uid=root;Pwd="; InitKeyType = InitKeyType.SystemTable; } } ``` #### 初始化 SqlSugarClient 对象 接着初始化针对各个数据源的 `SqlSugarClient` 实例[^2]: ```csharp private static readonly ISqlSugarClient _dbA = new SqlSugarClient(new ConnectionConfigA()); private static readonly ISqlSugarClient _dbB = new SqlSugarClient(new ConnectionConfigB()); // 可选:开启事务处理等功能... _dbA.Aop.OnLogExecuting = (sql, pars) => Console.WriteLine(sql); _dbB.Aop.OnLogExecuting = (sql, pars) => Console.WriteLine(sql); ``` #### 设计通用接口与具体实现 设计一个泛型仓储接口用于抽象化对实体的操作逻辑,并为每种类型的数据提供具体的实现方式: ```csharp public interface IRepository<TEntity> where TEntity : class,new() { List<TEntity> GetAll(); void Add(TEntity entity); bool Update(TEntity entity); bool Delete(object id); } public abstract class BaseRepository<TEntity,TContext>:IRepository<TEntity> where TEntity:class ,new() where TContext:ISqlSugarClient { protected readonly TContext Context; public BaseRepository(TContext context) { this.Context=context; } public virtual List<TEntity> GetAll()=>this.Context.Queryable<TEntity>().ToList(); public virtual void Add(TEntity entity)=>this.Context.Insert(entity); public virtual bool Update(TEntity entity)=> this.Context.Updateable(entity).ExecuteCommandHasChange(); public virtual bool Delete(object id)=> this.Context.Deleteable<TEntity>(id).ExecuteCommandHasChange(); } ``` #### 针对特定数据的具体实现 对于每个实际使用的数据,继承自上述基类并指定对应的 `_dbXxx` 作为参数传递给构造函数: ```csharp public class RepositoryDbA<TEntity> : BaseRepository<TEntity, ISqlSugarClient>, IRepository<TEntity> where TEntity : class, new() { public RepositoryDbA(ISqlSugarClient db):base(db){} // 如果有必要的话重写某些方法以适应特殊需求 } public class RepositoryDbB<TEntity> : BaseRepository<TEntity, ISqlSugarClient>, IRepository<TEntity> where TEntity : class, new() { public RepositoryDbB(ISqlSugarClient db):base(db){} // 同上 } ``` #### 工厂模式选择合适的仓储服务 最后利用工厂模式根据业务场景灵活选取所需的仓储实例: ```csharp public static class RepositoryFactory { private static Dictionary<string,IRepository<object>> repositories=new Dictionary<string, IRepository<object>>(); public static IRepository<TEntity> GetInstance<TEntity>(string dbName)where TEntity :class ,new() { var key=$"{typeof(TEntity)}_{dbName}"; if(!repositories.ContainsKey(key)) switch(dbName.ToLower()) case "a": repositories[key]=new RepositoryDbA<TEntity>(_dbA) as IRepository<TEntity>; break; case "b": repositories[key]=new RepositoryDbB<TEntity>(_dbB) as IRepository<TEntity>; break; default: throw new ArgumentException($"Unsupported database name '{dbName}'"); return repositories[key]as IRepository<TEntity>; } } ``` 这样就可以根据不同条件轻松获取到对应于不同数据上的持久层组件了。当应用程序需要访问某个特定表时,只需调用 `RepositoryFactory.GetInstance<YourModel>("database_name")` 即可获得相应仓储对象来进行CRUD操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值