通用的业务编码规则设计实现(二)

2014-11-23 22:06:32 · 作者: · 浏览: 1
me, object value);
string Next();
string Next(int qty);
}
复制代码
Sequence.cs
复制代码
public class Sequence : ISequence
{
private SequenceContext _context;
public Sequence(string name)
{
_context = new SequenceContext();
_context.TenantID = SdxLoginer.TenantID;
_context.SequenceName = name;
}
public ISequence SetDbContext(IDbContext db)
{
_context.db = db;
return this;
}
public ISequence SetTenantID(string tenantId)
{
_context.TenantID = tenantId;
return this;
}
public ISequence SetValues(Dictionary row)
{
_context.row = row;
return this;
}
public ISequence SetValues(JToken row)
{
if (row != null)
foreach (JProperty item in row.Children())
if (item != null) _context.row[item.Name] = ((JValue)item.Value).Value;
return this;
}
public ISequence SetValue(string name, object value)
{
if (!string.IsNullOrEmpty(name))
_context.row[name] = value;
return this;
}
public string Next()
{
return Next(1);
}
public string Next(int qty)
{
bool IsCreateDb = false;
var result = string.Empty;
try
{
if (_context.db == null)
{
_context.db = Db.Context(App.DefaultConnectionName App.GetDefaultConnectionName());
_context.db.UseTransaction(true);
_context.db.UseSharedConnection(true);
IsCreateDb = true;
}
//初始化Sequence数据
//加载Sequence重置依赖
//加载Sequence规则
//生成Sequence处理
for (var i = 0; i < qty; i++)
{
_context.CurrentCode = string.Empty;
foreach (var rule in _context.Rules)
_context.CurrentCode += (_context.CurrentCode.Length > 0 _context.SequenceDelimiter : string.Empty)
+ rule.Series(_context);
result += (result.Length > 0 "," : string.Empty) + _context.CurrentCode;
}
//更新 CurrentNo
}
catch (Exception e)
{
if (IsCreateDb)
_context.db.Rollback();
throw e;
}
finally
{
if (IsCreateDb)
{
_context.db.Commit();
_context.db.Dispose();
}
}
return result;
}
}
复制代码
SequenceContext.cs
复制代码
public class SequenceContext
{
public IDbContext db { get; set; }
public ISequenceReset SequenceReset { get; set; }
public List Rules { get; set; }
public string TenantID { get; set; }
public string SequenceName { get; set; }
public string SequenceDelimiter { get; set; }
public int Step { get; set; }
public int CurrentNo { get; set; }
public string CurrentCode { get; set; }
public string CurrentReset { get; set; }
public bool IsMultipleTenant { get; set; }
public Dictionary row { get; set; }
public SequenceContext()
{
db = null;
SequenceReset = new NullSequenceReset();
Rules = new List();
TenantID = "";