From ea76ebc35d570e9f0ab6222d58bfd8232c310a17 Mon Sep 17 00:00:00 2001 From: yubaolee Date: Tue, 24 Nov 2015 15:49:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A3=E5=BC=8F=E8=A7=A3=E5=86=B3EF=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OpenAuth.App/ModuleManagerApp.cs | 24 +++--- OpenAuth.App/OrgManagerApp.cs | 79 +++++++++---------- .../Controllers/OrgManagerController.cs | 4 +- OpenAuth.UnitTest/OpenAuth.UnitTest.csproj | 1 + OpenAuth.UnitTest/TestModuleApp.cs | 49 +++--------- OpenAuth.UnitTest/TestOrgApp.cs | 72 ++++------------- OpenAuth.UnitTest/TestRepository.cs | 63 +++++++++++++++ 7 files changed, 141 insertions(+), 151 deletions(-) create mode 100644 OpenAuth.UnitTest/TestRepository.cs diff --git a/OpenAuth.App/ModuleManagerApp.cs b/OpenAuth.App/ModuleManagerApp.cs index 8753de68..6fcc00ba 100644 --- a/OpenAuth.App/ModuleManagerApp.cs +++ b/OpenAuth.App/ModuleManagerApp.cs @@ -105,22 +105,10 @@ namespace OpenAuth.App #region 私有方法 //根据同一级中最大的语义ID - private int GetMaxCascadeId(int parentId) - { - int currentCascadeId = 1; - var sameLevels = _repository.Find(o => o.ParentId == parentId); - foreach (var obj in sameLevels) - { - int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last()); - if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1; - } - return currentCascadeId; - } - - private int[] GetSubOrgIds(int orgId) + private int[] GetSubOrgIds(int parentId) { - var parent = _repository.FindSingle(u => u.Id == orgId); + var parent = _repository.FindSingle(u => u.Id == parentId); var orgs = _repository.Find(u => u.CascadeId.Contains(parent.CascadeId)).Select(u => u.Id).ToArray(); return orgs; } @@ -129,7 +117,13 @@ namespace OpenAuth.App private void ChangeModuleCascade(Module module) { string cascadeId; - int currentCascadeId = GetMaxCascadeId(module.ParentId); + int currentCascadeId = 1; //当前结点的级联节点最后一位 + var sameLevels = _repository.Find(o => o.ParentId == module.ParentId && o.Id != module.Id); + foreach (var obj in sameLevels) + { + int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last()); + if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1; + } if (module.ParentId != 0) { diff --git a/OpenAuth.App/OrgManagerApp.cs b/OpenAuth.App/OrgManagerApp.cs index d0ebfb91..81b2a4bc 100644 --- a/OpenAuth.App/OrgManagerApp.cs +++ b/OpenAuth.App/OrgManagerApp.cs @@ -55,10 +55,46 @@ namespace OpenAuth.App /// The org. /// System.Int32. /// 未能找到该组织的父节点信息 - public int AddOrg(Org org) + public int AddOrUpdate(Org org) + { + + ChangeModuleCascade(org); + if (org.Id == 0) + { + _repository.Add(org); + } + else + { + _repository.Update(org); + } + + return org.Id; + } + + /// + /// 删除指定ID的部门及其所有子部门 + /// + public void DelOrg(int id) + { + var delOrg = _repository.FindSingle(u => u.Id == id); + if (delOrg == null) return; + + _repository.Delete(u => u.CascadeId.Contains(delOrg.CascadeId)); + } + + #region 私有方法 + + //修改对象的级联ID,生成类似XXX.XXX.X.XX + private void ChangeModuleCascade(Org org) { string cascadeId; - int currentCascadeId = GetMaxCascadeId(org.ParentId); + int currentCascadeId = 1; //当前结点的级联节点最后一位 + var sameLevels = _repository.Find(o => o.ParentId == org.ParentId && o.Id != org.Id); + foreach (var obj in sameLevels) + { + int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last()); + if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1; + } if (org.ParentId != 0) { @@ -76,47 +112,10 @@ namespace OpenAuth.App else { cascadeId = "0." + currentCascadeId; - org.ParentName = ""; + org.ParentName = "根节点"; } org.CascadeId = cascadeId; - org.CreateTime = DateTime.Now; - _repository.Add(org); - _repository.Save(); - return org.Id; - } - - public void ModifyOrg(Org org) - { - _repository.Update(org); - } - - /// - /// 删除指定ID的部门及其所有子部门 - /// - public void DelOrg(int id) - { - var delOrg = _repository.FindSingle(u => u.Id == id); - if (delOrg == null) return; - - _repository.Delete(u => u.CascadeId.Contains(delOrg.CascadeId)); - } - - #region 私有方法 - - //根据同一级中最大的语义ID - private int GetMaxCascadeId(int parentId) - { - int currentCascadeId = 1; - - var sameLevels = _repository.Find(o => o.ParentId == parentId); - foreach (var obj in sameLevels) - { - int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last()); - if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1; - } - - return currentCascadeId; } #endregion 私有方法 diff --git a/OpenAuth.Mvc/Controllers/OrgManagerController.cs b/OpenAuth.Mvc/Controllers/OrgManagerController.cs index 108bd26c..295eb6bd 100644 --- a/OpenAuth.Mvc/Controllers/OrgManagerController.cs +++ b/OpenAuth.Mvc/Controllers/OrgManagerController.cs @@ -49,7 +49,7 @@ namespace OpenAuth.Mvc.Controllers { try { - _orgApp.AddOrg(org); + _orgApp.AddOrUpdate(org); } catch (Exception ex) { @@ -64,7 +64,7 @@ namespace OpenAuth.Mvc.Controllers try { var org = JsonHelper.Instance.Deserialize(json); - _orgApp.ModifyOrg(org); + _orgApp.AddOrUpdate(org); } catch (Exception ex) { diff --git a/OpenAuth.UnitTest/OpenAuth.UnitTest.csproj b/OpenAuth.UnitTest/OpenAuth.UnitTest.csproj index 3b60a082..94977d97 100644 --- a/OpenAuth.UnitTest/OpenAuth.UnitTest.csproj +++ b/OpenAuth.UnitTest/OpenAuth.UnitTest.csproj @@ -67,6 +67,7 @@ + diff --git a/OpenAuth.UnitTest/TestModuleApp.cs b/OpenAuth.UnitTest/TestModuleApp.cs index d3d3cb23..afa4eb0e 100644 --- a/OpenAuth.UnitTest/TestModuleApp.cs +++ b/OpenAuth.UnitTest/TestModuleApp.cs @@ -19,43 +19,7 @@ namespace OpenAuth.UnitTest private TestContext testContextInstance; private ModuleManagerApp _app = new ModuleManagerApp(new ModuleRepository()); private string _time = DateTime.Now.ToString("HH_mm_ss_ms"); - /// - ///获取或设置测试上下文,该上下文提供 - ///有关当前测试运行及其功能的信息。 - /// - public TestContext TestContext - { - get - { - return testContextInstance; - } - set - { - testContextInstance = value; - } - } - - #region 附加测试特性 - // - // 编写测试时,可以使用以下附加特性: - // - // 在运行类中的第一个测试之前使用 ClassInitialize 运行代码 - // [ClassInitialize()] - // public static void MyClassInitialize(TestContext testContext) { } - // - // 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码 - // [ClassCleanup()] - // public static void MyClassCleanup() { } - // - // 在运行每个测试之前,使用 TestInitialize 来运行代码 - // [TestInitialize()] - // public void MyTestInitialize() { } - // - // 在每个测试运行完之后,使用 TestCleanup 来运行代码 - // [TestCleanup()] - // public void MyTestCleanup() { } - // - #endregion + //初始化导航 [TestMethod] @@ -120,8 +84,15 @@ namespace OpenAuth.UnitTest [TestMethod] public void TestEdit() { - var module = _app.Find(7); - _app.AddOrUpdate(module); + //var module = _app.Find(7); + //_app.AddOrUpdate(module); + + var module1 = new Module + { + Id = 14, + Name = DateTime.Now.ToString() + }; + _app.AddOrUpdate(module1); } [TestMethod] diff --git a/OpenAuth.UnitTest/TestOrgApp.cs b/OpenAuth.UnitTest/TestOrgApp.cs index a0f3284a..d645569d 100644 --- a/OpenAuth.UnitTest/TestOrgApp.cs +++ b/OpenAuth.UnitTest/TestOrgApp.cs @@ -1,6 +1,7 @@ using System; using System.Text; using System.Collections.Generic; +using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenAuth.App; using OpenAuth.Domain; @@ -14,74 +15,32 @@ namespace OpenAuth.UnitTest [TestClass] public class TestOrgApp { - public TestOrgApp() - { - // - //TODO: 在此处添加构造函数逻辑 - // - } private TestContext testContextInstance; private OrgManagerApp _app = new OrgManagerApp(new OrgRepository()); - /// - ///获取或设置测试上下文,该上下文提供 - ///有关当前测试运行及其功能的信息。 - /// - public TestContext TestContext - { - get - { - return testContextInstance; - } - set - { - testContextInstance = value; - } - } - - #region 附加测试特性 - // - // 编写测试时,可以使用以下附加特性: - // - // 在运行类中的第一个测试之前使用 ClassInitialize 运行代码 - // [ClassInitialize()] - // public static void MyClassInitialize(TestContext testContext) { } - // - // 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码 - // [ClassCleanup()] - // public static void MyClassCleanup() { } - // - // 在运行每个测试之前,使用 TestInitialize 来运行代码 - // [TestInitialize()] - // public void MyTestInitialize() { } - // - // 在每个测试运行完之后,使用 TestCleanup 来运行代码 - // [TestCleanup()] - // public void MyTestCleanup() { } - // - #endregion + [TestMethod] public void TestAddOrg() { - int rootId = _app.AddOrg(new Org + int rootId = _app.AddOrUpdate(new Org { Name = "集团总部", ParentId = 0 }); Assert.IsTrue(rootId != 0); - int id = _app.AddOrg(new Org + int id = _app.AddOrUpdate(new Org { Name = "一分公司", ParentId = rootId }); - id = _app.AddOrg(new Org + id = _app.AddOrUpdate(new Org { Name = "二分公司", ParentId = rootId }); - id = _app.AddOrg(new Org + id = _app.AddOrUpdate(new Org { Name = "三分公司", ParentId = rootId @@ -93,19 +52,19 @@ namespace OpenAuth.UnitTest [TestMethod] public void TestDelOrg() { - int rootId = _app.AddOrg(new Org + int rootId = _app.AddOrUpdate(new Org { Name = "即将被删除", ParentId = 0 }); Assert.IsTrue(rootId != 0); - int id = _app.AddOrg(new Org + int id = _app.AddOrUpdate(new Org { Name = "即将被删除1", ParentId = rootId }); - id = _app.AddOrg(new Org + id = _app.AddOrUpdate(new Org { Name = "即将被删除2", ParentId = id @@ -129,13 +88,16 @@ namespace OpenAuth.UnitTest [TestMethod] public void TestEdit() { - var org = new Org - { - Id = 60, - Name = "test" + //var org = _app.GetAll().FirstOrDefault(); + //org.Name = DateTime.Now.ToShortTimeString(); + //_app.AddOrUpdate(org); + var org1 = new Org + { + Id = 1, + Name = DateTime.Now.ToShortTimeString() }; - _app.ModifyOrg(org); + _app.AddOrUpdate(org1); } } } diff --git a/OpenAuth.UnitTest/TestRepository.cs b/OpenAuth.UnitTest/TestRepository.cs new file mode 100644 index 00000000..fb95a5df --- /dev/null +++ b/OpenAuth.UnitTest/TestRepository.cs @@ -0,0 +1,63 @@ +using System; +using System.Text; +using System.Collections.Generic; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenAuth.Domain; +using OpenAuth.Repository; + +namespace OpenAuth.UnitTest +{ + /// + /// TestRepository 的摘要说明 + /// + [TestClass] + public class TestRepository + { + + #region 附加测试特性 + // + // 编写测试时,可以使用以下附加特性: + // + // 在运行类中的第一个测试之前使用 ClassInitialize 运行代码 + // [ClassInitialize()] + // public static void MyClassInitialize(TestContext testContext) { } + // + // 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码 + // [ClassCleanup()] + // public static void MyClassCleanup() { } + // + // 在运行每个测试之前,使用 TestInitialize 来运行代码 + // [TestInitialize()] + // public void MyTestInitialize() { } + // + // 在每个测试运行完之后,使用 TestCleanup 来运行代码 + // [TestCleanup()] + // public void MyTestCleanup() { } + // + #endregion + + //测试被EF跟踪的对象修改 + [TestMethod] + public void TestTrackingEdit() + { + + var moduleRep = new ModuleRepository(); + //var module = moduleRep.FindSingle(u => u.Id == 14); + //module.CascadeId = DateTime.Now.ToShortTimeString(); + //如果不加u.Id !=7 则会造成异常,可理解为数据库的默认隔离级别为“读已提交”,不允许脏读! + //var obstruct = moduleRep.Find(u =>u.Id != 7); + //foreach (var module1 in obstruct) + //{ + // module.CascadeId += module1.CascadeId; + //} + //moduleRep.Update(module); + + var module2 = new Module + { + Id = 14, + CascadeId = DateTime.Now.ToShortTimeString() + }; + moduleRep.Update(module2); + } + } +}