如何使该控制器的类和构造函数可重用?

时间:2018-07-18 06:27:58

标签: c# asp.net-mvc controller .net-core

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的类和构造函数中都使用了它。我试图用一种可以传递动态参数并且可以从不同类调用的方法来实现这一点。

2 个答案:

答案 0 :(得分:0)

我将从使用界面开始:

    for i in G:
        for j in I:
            V = f(i,j)

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

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;}
}

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

如果要使其更加可重用,并且正在使用实体框架,则可以使用BaseModel并使用基本类型T实现RepositoryFactory,这样,UnitOfWorkFactory不会变得混乱。但是,这没关系。

以下是此模式上的链接:microsoft-uow pattern implementation

希望能回答您的问题。

Joachim。

答案 1 :(得分:0)

如何将BaseController类与接受IHttpContextAccessor和IHostingEnvironment的构造方法一起使用,并让所有控制器都继承自该类?