首页 > 解决方案 > 如何使这个控制器的类和构造函数可重用?

问题描述

public class AccountsMstController : Controller
{
    private AccountsMstRepository _AccountsMstRepository;
    public ErpOneLogRepository _ErpOneLogRepository;
    private DeleteRecordRepository _DeleteRecordRepository;
    private IHttpContextAccessor _contextAccessor;
    private HttpContext _context;
    private string username;
    private IHostingEnvironment _env;
    private string user;
    private string dbname;
    public AccountsMstController(IHttpContextAccessor contextAccessor, 
    IHostingEnvironment env)
    {
        _contextAccessor = contextAccessor;
        _context = _contextAccessor.HttpContext;
        username = _context.User.Identity.Name;
        _env = env;

        string[] Split = username.Split(new char[] { '@', '.' });
        dbname = Convert.ToString(Split[1]);
        user = Convert.ToString(Split[0]);
        _AccountsMstRepository = new AccountsMstRepository(dbname);
        _DeleteRecordRepository = new DeleteRecordRepository(dbname);
        _ErpOneLogRepository = new ErpOneLogRepository(dbname);
    }
 }

试图使此代码可重用,并且可以通过函数指针调用,因为它在每个 Controller 的类和构造函数中使用。我试图在一个可以传递动态参数并且可以从不同类调用的单一方法中实现这一点。

标签: c#asp.net-mvccontroller.net-core

解决方案


我将从使用界面开始:

public interface IController {
    HttpContext Context{get; set; }
    string Username {get; set; }
    IHostingEnvironment Environment {get; set; }
    string User {get; set; }
    string DbName {get; set; }
    UnitOfWork ControllerWork {get; set;}
}

假设存储库包含一个 DbContext 对象,您可以使用 Repository - UnitOfWork 模式

public interface UnitOfWorkFactory {
    AccountsMstRepository AccountsMstRepository {get; set;}
    ErpOneLogRepository ErpOneLogRepository get; set;}
    DeleteRecordRepository DeleteRecordRepository {get; set;}
    DbContext DbContext {get; set;}

    // CRUD methods to update repository
}

public interface RepositoryFactory {
    DbContext context {get; set;}

    // CRUD methods to update repository
}

这样每个不同的控制器都可以实现 IController 接口,因此您可以使用中间 UnitOfWork 访问每个控制器上的存储库(您需要创建一个实现此的类)

如果您想让它更加可重用并且您正在使用实体框架,您可以使用 BaseModel 并使用基本类型 T 实现 RepositoryFactory,这样您的 UnitOfWorkFactory 就不会变得混乱。但为此,这没关系。

这是该模式的链接:microsoft-uow 模式实现

希望已经回答了你的问题。

约阿希姆。


推荐阅读