C# 典型三层业务层中的静态方法与实例方法

C# 典型三层业务层中的静态方法与实例方法,c#,asp.net,asp.net-mvc,static-methods,static-class,C#,Asp.net,Asp.net Mvc,Static Methods,Static Class,目前,我正在使用ASP.NET MVC构建一个典型的三层web应用程序。我使用依赖项注入(Autofac)进行了如下设置: public class UserController : BaseController { private readonly IUserService _userService; public UserController(IUserService userService) { this._userService = userSer

目前,我正在使用ASP.NET MVC构建一个典型的三层web应用程序。我使用依赖项注入(Autofac)进行了如下设置:

public class UserController : BaseController
{
    private readonly IUserService _userService;
    public UserController(IUserService userService)
    {
        this._userService = userService;
    }
}

public class IUserService
{
    void InsertUser(User user);
    void UpdateUser(User user);
    void DeleteUser(User user);
}
public class UserService : IUserService
{
    private readonly IRepository<User> _userRepository;
    public UserService(IRepository<User> userRepository)
    {
        this._userRepository = userRepository;
    }
    public void InsertUser(User user)
    {
        _userRepository.Insert(user);
    }
    public void UpdateUser(User user)
    {
        _userRepository.Update(user);
    }
    public void DeleteUser(User user)
    {
        _userRepository.Delete(user);
    }
}
public static class CommonService
{
    public static void Insert<T>(T entity) where T : BaseEntity
    {
        var repository = EngineContext.Current.Resolve<IRepository<T>>();
        repository.Insert(entity);
    }
    public static void Update<T>(T entity) where T : BaseEntity
    {
        var repository = EngineContext.Current.Resolve<IRepository<T>>();
        repository.Update(entity);
    }
    public static void Delete<T>(T entity) where T : BaseEntity
    {
        var repository = EngineContext.Current.Resolve<IRepository<T>>();
        repository.Delete(entity);
    }
}
公共类UserController:BaseController
{
专用只读IUserService\u userService;
公共用户控制器(IUserService用户服务)
{
这是。_userService=userService;
}
}
公共类服务
{
无效插入器(用户);
void UpdateUser(用户);
无效删除用户(用户);
}
公共类UserService:IUserService
{
私有只读IRepository用户存储库;
公共用户服务(IRepository userRepository)
{
这是。_userRepository=userRepository;
}
公共void插入器(用户)
{
_userRepository.Insert(用户);
}
public void UpdateUser(用户)
{
_userRepository.Update(用户);
}
公共void DeleteUser(用户)
{
_userRepository.Delete(用户);
}
}
Repository是使用EF的典型通用存储库

public interface IRepository<T> where T : BaseEntity
{
    void Insert(T entity);
    void Update(T entity);
    void Delete(T entity);
}
公共接口i位置,其中T:BaseEntity
{
无效插入(T实体);
无效更新(T实体);
无效删除(T实体);
}
问题是我的应用程序有很多实体,对于每个实体,我必须在服务层复制上面的CRUD操作代码。例如:对于实体“Role”,我有“InsertRole”、“UpdateRole”、“DeleteRole”。。。对于其他实体来说,还有更多。 因此,我尝试通过使用如下静态方法将CRUD操作提取到静态类“CommonService”来重构以删除重复代码:

public class UserController : BaseController
{
    private readonly IUserService _userService;
    public UserController(IUserService userService)
    {
        this._userService = userService;
    }
}

public class IUserService
{
    void InsertUser(User user);
    void UpdateUser(User user);
    void DeleteUser(User user);
}
public class UserService : IUserService
{
    private readonly IRepository<User> _userRepository;
    public UserService(IRepository<User> userRepository)
    {
        this._userRepository = userRepository;
    }
    public void InsertUser(User user)
    {
        _userRepository.Insert(user);
    }
    public void UpdateUser(User user)
    {
        _userRepository.Update(user);
    }
    public void DeleteUser(User user)
    {
        _userRepository.Delete(user);
    }
}
public static class CommonService
{
    public static void Insert<T>(T entity) where T : BaseEntity
    {
        var repository = EngineContext.Current.Resolve<IRepository<T>>();
        repository.Insert(entity);
    }
    public static void Update<T>(T entity) where T : BaseEntity
    {
        var repository = EngineContext.Current.Resolve<IRepository<T>>();
        repository.Update(entity);
    }
    public static void Delete<T>(T entity) where T : BaseEntity
    {
        var repository = EngineContext.Current.Resolve<IRepository<T>>();
        repository.Delete(entity);
    }
}
公共静态类CommonService
{
公共静态无效插入(T实体),其中T:BaseEntity
{
var repository=EngineContext.Current.Resolve();
储存库。插入(实体);
}
公共静态无效更新(T实体),其中T:BaseEntity
{
var repository=EngineContext.Current.Resolve();
更新(实体);
}
公共静态无效删除(T实体),其中T:BaseEntity
{
var repository=EngineContext.Current.Resolve();
删除(实体);
}
}
有了这个类,我将删除CRUD操作服务中的重复代码。 在控制器中,我只调用CommonService.Insert(user);。。。 现在对我真的很好。我仍然有其他的服务方法作为正常和没有重复的积垢。 但我想知道除了单元测试(我不会对CRUD进行单元测试)之外,这种方法是否还有任何缺点。web环境(ASP.NET MVC)中的内存管理和并发处理是否有问题? 我还没有用EF实现数据处理的并发机制(同步更新实体…)

提前谢谢!
MillDol.

如果您决定保留该静态实现,请创建一个使用该实现的接口和代理类,您仍然可以对使用该实现的实现进行单元测试。您不想放弃单元测试

public interface ICommonService<T>
{
    void Insert<T>(T entity);
    void Update<T>(T entity);
    void Delete<T>(T entity);
}

然后,您可以让控制器依赖于
ICommonService
,而不必在幕后进行静态方法调用

如果您决定保留该静态实现,请创建一个使用它的接口和代理类,您仍然可以对使用它的实现进行单元测试。您不想放弃单元测试

public interface ICommonService<T>
{
    void Insert<T>(T entity);
    void Update<T>(T entity);
    void Delete<T>(T entity);
}

然后,您可以让控制器依赖于
ICommonService
,而不必在幕后进行静态方法调用

我知道这是一个非常古老的概念,但是我刚刚遇到了这个问题,我想知道为什么不采用这个静态实现,将它变成一个抽象类,类似于BaseService。
通过这种方式,您可以使用方法的单个实现来删除您提到的所有重复代码,但如果任何特定实体需要任何特殊处理,您仍然可以在每个特定服务实现中处理它。

我知道这非常古老,但是刚刚遇到这个问题,我想知道为什么不采用静态实现并将其作为一个抽象类—类似于BaseService。
这样,您就可以使用方法的单个实现来删除您提到的所有重复代码,但如果任何特定实体需要任何特殊处理,您仍然可以在每个特定服务实现中处理它。

对我来说似乎非常重要。我将在这里实现特定于服务的功能,而不是一整套CRUD操作。我认为,一旦你开始开发,你就会意识到你可能不需要或不想从开发开始。将CRUD保存在存储库层中,并在服务层(BLL)中使用它的业务逻辑。@Igor:是的,我认为这太抽象了。但是,如果CRUD仅位于存储库层,那么控制器将同时依赖于业务和存储库?我在许多企业项目中工作,看到业务只是将呼叫转发到存储库。有没有解决这个问题的架构?对我来说似乎非常重要。我将在这里实现特定于服务的功能,而不是一整套CRUD操作。我认为,一旦你开始开发,你就会意识到你可能不需要或不想从开发开始。将CRUD保存在存储库层中,并在服务层(BLL)中使用它的业务逻辑。@Igor:是的,我认为这太抽象了。但是,如果CRUD仅位于存储库层,那么控制器将同时依赖于业务和存储库?我在许多企业项目中工作,看到业务只是将呼叫转发到存储库。有解决这个问题的架构吗?我知道你的想法。我要试一试。我只是想知道我的框架是否过于抽象,是否还有其他方法可以删除它。明白你的想法了。我要试一试。只是想知道我的框架是否过于抽象,是否还有其他方法可以删除它。