一歩一歩ASPを作成する.NET MVC 5プログラム[Repository+Autofac+Automapper+SqlSugar](七)


前言


皆さん、こんにちは、私は依然としてあなた达の古い友达のレコードで、とても喜んでまた金曜日の时に时间通りにみんなに会います.
Rectorのシリーズの文章【一歩一歩ASP.NET MVC 5プログラムを作成する[Repository+Autofac+Automapper+SqlSugar]】は執筆以来、すでに6期が出ており、その中で多くの友人に愛されている.NET/C#の開発の旅で自分の開発技術と経験をより速く向上させる.
上一篇《一歩一歩ASP.NET MVC 5プログラムを作成する[Repository+Autofac+Automapper+SqlSugar](六)》TsBlogアプリケーションの倉庫層に対して重大な再構築を行った.すなわち、汎用倉庫を使用して汎用的なデータベース操作をカプセル化し、倉庫層インタフェースを作成し、実現する際に重複するコードを簡素化する.今日共有するのはサービス層の汎用パッケージと再構築である.実現原理は倉庫層とほぼ似ている.

本文の知識の要点

  • 汎用サービス層のパッケージと再構築
  • サービス層の再構築


    汎用サービスベースクラスの抽出


    プロジェクト[TsBlog.Services]を開き、サービス層汎用インタフェースクラスIServiceを作成します.csは、サービス層に共通するインタフェースメソッドを作成します.以下のようにします.
    using System;
    using System.Collections.Generic;
    using System.Linq.Expressions;
    
    namespace TsBlog.Services
    {
        /// 
        ///     
        /// 
        /// 
        public interface IService
        {
            /// 
            ///           
            /// 
            ///    
            ///     
            T FindById(object pkValue);
    
            /// 
            ///       (   ,   )
            /// 
            /// 
            IEnumerable FindAll();
    
            /// 
            ///         
            /// 
            ///       
            ///   
            ///       
            IEnumerable FindListByClause(Expression> predicate, string orderBy);
    
            /// 
            ///         
            /// 
            ///       
            /// 
            T FindByClause(Expression> predicate);
    
            /// 
            ///       
            /// 
            ///    
            /// 
            long Insert(T entity);
    
            /// 
            ///       
            /// 
            /// 
            /// 
            bool Update(T entity);
    
            /// 
            ///     
            /// 
            ///    
            /// 
            bool Delete(T entity);
    
            /// 
            ///     
            /// 
            ///     
            /// 
            bool Delete(Expression> @where);
    
            /// 
            ///     ID   
            /// 
            /// 
            /// 
            bool DeleteById(object id);
    
            /// 
            ///     ID     (    )
            /// 
            /// 
            /// 
            bool DeleteByIds(object[] ids);
        }
    }

    汎用ベースクラスGenericServicesを再作成します.csは、サービス層を作成するための一般的な方法です.以下のようにします.
    using System;
    using System.Collections.Generic;
    using System.Linq.Expressions;
    using TsBlog.Repositories;
    
    namespace TsBlog.Services
    {
        public abstract class GenericService : IService, IDependency where T : class, new()
        {
            private readonly IRepository _repository;
    
            protected GenericService(IRepository repository)
            {
                _repository = repository;
            }
    
            /// 
            ///           
            /// 
            ///    
            ///     
            public T FindById(object pkValue)
            {
                return _repository.FindById(pkValue);
            }
    
            /// 
            ///       (   ,   )
            /// 
            /// 
            public IEnumerable FindAll()
            {
                return _repository.FindAll();
            }
    
            /// 
            ///         
            /// 
            ///       
            ///   
            ///       
            public IEnumerable FindListByClause(Expression> predicate, string orderBy)
            {
                return _repository.FindListByClause(predicate, orderBy);
            }
    
            /// 
            ///         
            /// 
            ///       
            /// 
            public T FindByClause(Expression> predicate)
            {
                return _repository.FindByClause(predicate);
            }
    
            /// 
            ///       
            /// 
            ///    
            /// 
            public long Insert(T entity)
            {
                return _repository.Insert(entity);
            }
    
            /// 
            ///       
            /// 
            /// 
            /// 
            public bool Update(T entity)
            {
                return _repository.Update(entity);  
            }
    
            /// 
            ///     
            /// 
            ///    
            /// 
            public bool Delete(T entity)
            {
                return _repository.Delete(entity);
            }
    
            /// 
            ///     
            /// 
            ///     
            /// 
            public bool Delete(Expression> @where)
            {
                return _repository.Delete(@where);
            }
    
            /// 
            ///     ID   
            /// 
            /// 
            /// 
            public bool DeleteById(object id)
            {
                return _repository.DeleteById(id);
            }
    
            /// 
            ///     ID     (    )
            /// 
            /// 
            /// 
            public bool DeleteByIds(object[] ids)
            {
                return _repository.DeleteByIds(ids);
            }
    
        }
    }

    IPostServicesを簡素化して変更します.cs:
    using TsBlog.Domain.Entities;
    using TsBlog.Repositories;
    
    namespace TsBlog.Services
    {
        public interface IPostService : IDependency, IService
        {
    
        }
    }

    PostServicesを再シンして変更します.cs:
    using TsBlog.Domain.Entities;
    using TsBlog.Repositories;
    
    namespace TsBlog.Services
    {
        public class PostService : GenericService, IPostService
        {
            private readonly IPostRepository _repository;
            public PostService(IPostRepository repository) : base(repository)
            {
                _repository = repository;
            }
        }
    }

    [TsBlog.Frontend]Webアプリケーションを再コンパイルし、F 5を押して実行すると、次のエラーメッセージが表示されます.
    これはなぜですか.前に書いたからcsクラスではIPostRepositoryインタフェースは継承されていませんが、PostServicesにいます.csクラスでは非汎用IPostRepossitoryインタフェースが使用するのでPostRepossitory.csクラスにIPostRepositoryのインタフェースを追加する、このときのPostRepository.cs :
    using TsBlog.Domain.Entities;
    
    namespace TsBlog.Repositories
    {
        /// 
        /// POST        
        /// 
        public class PostRepository : GenericRepository, IPostRepository
        {
    
        }
    }

    最終的なGlobal.asax.cs :
    using Autofac;
    using Autofac.Features.ResolveAnything;
    using Autofac.Integration.Mvc;
    using System;
    using System.Linq;
    using System.Web.Mvc;
    using System.Web.Routing;
    using TsBlog.AutoMapperConfig;
    using TsBlog.Repositories;
    
    namespace TsBlog.Frontend
    {
        public class MvcApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                //BundleConfig.RegisterBundles(BundleTable.Bundles);
    
                AutofacRegister();
    
                AutoMapperRegister();
            }
    
            private void AutofacRegister()
            {
                var builder = new ContainerBuilder();
    
                //  MvcApplication          
                builder.RegisterControllers(typeof(MvcApplication).Assembly);
    
                //       
                //builder.RegisterType().As();
                //           
                var assembly = AppDomain.CurrentDomain.GetAssemblies();
                builder.RegisterAssemblyTypes(assembly)
                    .Where(
                        t => t.GetInterfaces()
                            .Any(i => i.IsAssignableFrom(typeof(IDependency)))
                    )
                    .AsImplementedInterfaces()
                    .InstancePerDependency();
                //builder.RegisterGeneric(typeof(GenericRepository<>))
                //    .As(typeof(IRepository<>));
                //builder.RegisterGeneric(typeof(GenericService<>))
                //    .As(typeof(IService<>));
    
                //builder.RegisterGeneric(typeof(GenericRepository<>));
                //builder.RegisterGeneric(typeof(GenericService<>));
    
                //       
                //builder.RegisterType().As();
    
                //     
                builder.RegisterFilterProvider();
                builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
                var container = builder.Build();
    
                //         
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    
            }
    
            /// 
            /// AutoMapper      
            /// 
            private void AutoMapperRegister()
            {
                new AutoMapperStartupTask().Execute();
            }
        }
    }

    再度F 5を押して実行し、ページを開く[http://localhost:54739/home/post]あ、ページが戻ってきた、ははは...
    本明細書のソース管理アドレス:https://github.com/lampo1024/...
    本文の勉强はこれで终わります.このシリーズはまだ终わっていません.次の号でまた会いましょう.
    もしあなたがレコードのこのシリーズの文章が好きならば、私のために大いにほめてください.
    もし問題が発生するならば、コード友網の公式QQ群に参加することを歓迎します:483350228
    本論文のソースコード友網《一歩一歩ASP.NET MVC 5プログラムを作成する[Repository+Autofac+Automapper+SqlSugar](七)》