一歩一歩ASPを作成する.NET MVC 5プログラム[Repository+Autofac+Automapper+SqlSugar](七)
10024 ワード
前言
皆さん、こんにちは、私は依然としてあなた达の古い友达のレコードで、とても喜んでまた金曜日の时に时间通りにみんなに会います.
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](七)》