金沙官网线上Asp.net mvc项目架构分享系列之架构概

.Infrastructure.Mn

 

.Infrastructure一般可以有4个文件夹:

13.Web搭建

可以看到,整个项目是比较清晰的:

8.项目架构搭建之IDAL搭建
9.项目架构搭建之MSSQLDAL搭建
10.项目架构搭建之IBLL搭建
11.项目架构搭建之BLL搭建

金沙官网线上 1

2.所用到的技术

 

3.项目引用关系 

       我们知道,一个Web项目如果使用MVC的方式的话常常使用到ApiController去请求数据,并根据返回的数据进行页面的更新。由于平台项目属于大型项目,所以平台架构师将ApiController/Action函数里的核心业务逻辑抽出,放在另一个解决方案中,即CoreService.sln。Web项目只要引用CoreService里的dlls,并以Unity注入的方式使用即可。为了不会让大家看得太晕,本篇还是以CoreService.sln为主,如何调用的话会写在下一篇中。

 

//实例化EF上下文操作接口
public abstract class EFRepositoryContext : IEFRepositoryContext
{
        protected abstract System.Data.Entity.DbContext GetContext();

        public System.Data.Entity.DbContext Context
        {
            get
            {
                return GetContext();
            }
        }

        public virtual void Initialize()
        {
            GetContext();
        }

        public virtual void Add<T>(T entity) where T : class
        {
            if (Context != null)
            {
                Context.Set<T>().Add(entity);
            }
            else
            {
                ServerLogger.Warn("Missing DB Context");
            }
        }

        public virtual void Update<T>(T entity) where T : class
        {
            if (Context != null)
            {
                Context.Set<T>().Attach(entity);
                Context.Entry<T>(entity).State = System.Data.Entity.EntityState.Modified;
            }
            else
            {
                ServerLogger.Warn("Missing DB Context");
            }
        }

        public virtual void Delete<T>(T entity) where T : class
        {
            if (Context != null)
            {
                Context.Set<T>().Remove(entity);
            }
            else
            {
                ServerLogger.Warn("Missing DB Context");
            }
        }

        public virtual void Save()
        {
            if (Context != null)
            {
                Context.SaveChanges();
            }
            else
            {
                ServerLogger.Warn("Missing DB Context");
            }
        }

        public virtual void BeginTransaction()
        {
            if (Context != null && Context.Database.CurrentTransaction == null)
            {
                ServerLogger.Info("Begin Transaction");
                Context.Database.BeginTransaction();
                ServerLogger.Info("Transaction started");
            }
        }

        public virtual void Commit()
        {
            if (Context != null && Context.Database.CurrentTransaction != null)
            {
                ServerLogger.Info("Start to Commit");
                Context.Database.CurrentTransaction.Commit();
                ServerLogger.Info("Committed");
            }
        }

        public virtual void Rollback()
        {
            if (Context != null && Context.Database.CurrentTransaction != null)
            {
                ServerLogger.Info("Start to rollback");
                Context.Database.CurrentTransaction.Rollback();
                ServerLogger.Info("Rollback");
            }
        }

        public virtual void Dispose()
        {
            try
            {
                if (Context != null)
                {
                    if (Context.Database.CurrentTransaction != null)
                    {
                        Context.Database.CurrentTransaction.Dispose();
                    }

                    if (Context.Database.Connection.State != System.Data.ConnectionState.Closed)
                    {
                        Context.Database.Connection.Close();
                    }
                    Context.Dispose();
                }
            }
            catch(Exception ex)
            {
                ServerLogger.Error("Faile to dispose DB context", ex);
            }
        }
}

Contents

三、.Infrastructure与.Core

5.项目创建 

.Module.Mn

1.项目解决方案分层方案 

.Infrastructure.Mn需要引用.Infrastructure与Database.EFModel项目。

系列三 【Infrastructure搭建

 

 

3. Infrastructure与Module是一对,Infrastructure用于定义相关接口,而Module用于实现Infrastructure的接口。这也是本文重点介绍的。

12.WebHelper搭建

五、结语

 

 

系列一【架构概览

当我们完成.Infrastructure项目之后就可以开始写其它模块了。

7.项目架构搭建之Models搭建

最简单的形式如下:

 

金沙官网线上 2

3.项目引用关系

  • Models
  • Core
  • IDAL --> Core ,Models
  • MSSQLDAL --> IDAL,Core,Models

  • MYSQL --> IDAL,Core,Models

  • IBLL --> IDAL,Core,Models
  • BLL --> IBLL,IDAL,Core,Models

  • WebHelper --> IBLL,Core,Models

  • AdminLogic -->WebHelper,Core,Models

  • Web --> AdminLogic,WebHelper,Core,Models

1. DatabaseContext主要定义与EF相关的操作接口:

 

 using log4net;
 using log4net.Appender;
 using log4net.Core;
 using log4net.Layout;
 using log4net.Repository.Hierarchy;

 //Logger
 public class ServerLogger
 {
        private static ILog Log { get; set; }

        static ServerLogger()
        {
            try
            {
                string logFolder = CommonDefine.GetLogPath();
                if (!Directory.Exists(logFolder))
                {
                    Directory.CreateDirectory(logFolder);
                }
                Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

                PatternLayout patternLayout = new PatternLayout();
                patternLayout.ConversionPattern = "%date{yyyy-MM-dd HH:mm:ss.fff} %level %message%newline";
                patternLayout.ActivateOptions();

                RollingFileAppender roller = new RollingFileAppender();
                roller.AppendToFile = true;
                roller.File = logFolder + @"server.log";
                roller.Layout = patternLayout;
                roller.MaxSizeRollBackups = 100;

                roller.RollingStyle = RollingFileAppender.RollingMode.Date;
                roller.StaticLogFileName = true;
                roller.ActivateOptions();
                hierarchy.Configured = true;

                Logger logger = hierarchy.GetLogger("IMLogger") as Logger;//Log as Logger;
                logger.Additivity = false;
                logger.Level = Level.All;
                logger.AddAppender(roller);

                Log = LogManager.GetLogger("IMLogger");
            }
            catch (Exception)
            {

            }
        }

        public static void Debug(string message)
        {
            if (CanLog(LogLevel.DEBUG))
            {
                Log.Debug(message);
            }
        }

        public static void Info(string message)
        {
            if (CanLog(LogLevel.INFO))
            {
                Log.Info(message);
            }
        }

        public static void Warn(string message)
        {
            if (CanLog(LogLevel.WARN))
            {
                Log.Warn(message);
            }
        }

        public static void Perfomance(Stopwatch watch, string actionName)
        {
            if (CanLog(LogLevel.PERFORMANCE))
            {
                if (watch.IsRunning)
                    watch.Stop();
                string message = string.Format(actionName + " consumes time {0}", watch.Elapsed.ToString());
                Log.Info(message);
            }
        }

        public static void Error(string message)
        {
            if (CanLog(LogLevel.ERROR))
            {
                Log.Error(message);
            }
        }

        /* Obsolete
        public static void Fatal(string message)
        {
            Log.Fatal(message);
        }
        */

        public static void Error(string message, Exception ex)
        {
            if (CanLog(LogLevel.ERROR))
            {
                Log.Error(message, ex);
            }
        }

        public static void SQL(string sqlScriptMesage)
        {
            if (CanLog(LogLevel.SQL))
            {
                Log.Info(sqlScriptMesage);
            }
        }

        private static bool CanLog(LogLevel level)
        {
            LogLevel levelConfig = GetLogLevel();
            return levelConfig >= level;
        }

        private static LogLevel GetLogLevel()
        {
            LogLevel level = LogLevel.ERROR;
            try
            {
                string logLevel = CommonDefine.GetLogLevel();
                level = (LogLevel)Enum.Parse(typeof(LogLevel), logLevel.ToUpper());
            }
            catch(Exception ex)
            {
                // Cannot use Error method to avoid stack overflow, use log tool directly
                Log.Error("Failed to parse log level setting", ex);
            }
            return level;
        }
}

public enum LogLevel
{
        ERROR = 1,
        WARN,
        INFO,
        SQL,
        PERFORMANCE,
        DEBUG
}

Asp.net mvc项目架构分享系列之架构概览

public interface IModuleOneRepository : IRepository<ModuleOneItem>
{
   //ModuleOneItem为EF的ORM对象!
}

public interface IModuleOneService
{
       void functionOne();
       void functionTwo();
}

14.AdminLogic搭建

最简单的形式如下:

6.项目架构搭建之Core搭建

 Core项目主要是注册所有接口并且对Infrastructure中定义的接口进行实现。

系列二【架构搭建初步

 

1.项目解决方案分层方案

  • UI

    • Web(网站主项目)
    • AdminLogic(管理员控制器逻辑)

    • WebHelper(web帮助类库)

    • Web.Tests(单元测试)【暂未加入项目,打算之后使用NUNIT代替】
  • Service

    • IBLL(业务逻辑接口层)
    • BLL(业务逻辑实现层)
  • Repository

    • IDAL(数据库服务接口层)
    • MSSQLDAL(MSSQLServer数据服务实现层)

    • MYSQLDAL(MYSQL数据服务实现层)【因为主要使用MSSQLSERVER,该项目已从解决方案中移除】

  • Infrastructure

    • Core(框架基础核心方法类库)

    • Models(数据模型层)

       

金沙官网线上 3

.Module.Mn需要引用.Infrastructure、Database.EFModel以及.Infrastructure.Mn项目

4.项目架构各部分解析

金沙官网线上 4

15.新增Model的处理


系列六 【项目扩展

本文由金沙官网线上发布于编程,转载请注明出处:金沙官网线上Asp.net mvc项目架构分享系列之架构概

您可能还会对下面的文章感兴趣: