Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从ASP.NET Core 2.0中的类库访问当前上下文的推荐方法?_C#_Asp.net Core 2.0 - Fatal编程技术网

C# 从ASP.NET Core 2.0中的类库访问当前上下文的推荐方法?

C# 从ASP.NET Core 2.0中的类库访问当前上下文的推荐方法?,c#,asp.net-core-2.0,C#,Asp.net Core 2.0,我们已经将我们的业务逻辑分离成一个单一的类库,所有其他项目都会引用它。我们的前端是Web表单,在此之前,它有一个使访问当前Web上下文非常容易的单例(HttpContext.current)。在ASP.NET Core 2.0中,这一点已经消失,似乎被依赖注入所取代 对我来说,DI似乎是朝着正确方向迈出的一步,我肯定能看到它的好处。然而,对于我的类库,我看不到使用DI的方法。因此,要访问满足业务需求所需的所有信息,我必须将所有这些信息作为参数传入 例如,每次创建新的数据库条目时,我都会记录当前用

我们已经将我们的业务逻辑分离成一个单一的类库,所有其他项目都会引用它。我们的前端是Web表单,在此之前,它有一个使访问当前Web上下文非常容易的单例(
HttpContext.current
)。在ASP.NET Core 2.0中,这一点已经消失,似乎被依赖注入所取代

对我来说,DI似乎是朝着正确方向迈出的一步,我肯定能看到它的好处。然而,对于我的类库,我看不到使用DI的方法。因此,要访问满足业务需求所需的所有信息,我必须将所有这些信息作为参数传入

例如,每次创建新的数据库条目时,我都会记录当前用户。通过我的web表单应用程序(我正在更换),我的业务逻辑库可以获得如下用户:

public abstract class TableBase
{
    public User Creator { get; private set; }

    internal TableBase() {}//EF select constructor

    internal TableBase(bool newRow)
    {
        Creator = User.Current;
    }
}

public class Client : TableBase
{
    public string Name { get; set; }

    protected Client() {}//EF select Constructor

    public Client(string name) : base(true)
    {
        Name = name;
    }
}

public class User
{
    public static User Current => GetUserFromContext(HttpContext.Current);
}
这非常有效,因为处理Creator的代码完全由基类处理,派生类看不见。派生类就可以工作了。然而,在ASP.NET Core 2.0中,
HttpContext.Current
singleton已经消失。显然被DI取代了。因此,我无法再像以前那样检查当前登录的用户。我环顾四周,但似乎找不到访问当前web上下文的方法。因此,我目前认为复制我的功能的工作方式如下:

public abstract class TableBase
{
    public User Creator { get; private set; }

    internal TableBase() {}//EF select constructor

    internal TableBase(User creator)
    {
        Creator = creator;
    }
}

public class Client : TableBase
{
    public string Name { get; set; }

    protected Client() {}//EF select constructor

    public Client(string name, User creator) : base(creator)
    {
        Name = name;
    }
}

public class MyPage : PageModel
{
    private readonly User _currentUser;
    private readonly DbContext _context;

    public MyPage(User currentUser, DbContext context)
    {
        _currentUser = currentUser;
        _context = context;
    }

    public async Task<IActionResult> OnPostAsync(string name)
    {
        var newClient = new Client(name, _currentUser);
        _context.Clients.Add(newClient);
        await _context.SaveChangesAsync();
        return RedirectToPage("/Index");
    }
}
公共抽象类表库
{
公共用户创建者{get;private set;}
内部TableBase(){}//EF select构造函数
内部数据库(用户创建者)
{
创造者=创造者;
}
}
公共类客户端:TableBase
{
公共字符串名称{get;set;}
受保护的客户端(){}//EF select构造函数
公共客户端(字符串名称,用户创建者):基本(创建者)
{
名称=名称;
}
}
公共类MyPage:PageModel
{
私有只读用户\u currentUser;
私有只读DbContext\u context;
公共MyPage(用户currentUser、DbContext上下文)
{
_currentUser=currentUser;
_上下文=上下文;
}
公共异步任务OnPostAsync(字符串名称)
{
var newClient=新客户机(名称,_currentUser);
_context.Clients.Add(newClient);
wait_context.SaveChangesAsync();
返回重定向Topage(“/索引”);
}
}
这是可行的,但也有一些不可取的特点

  • 现在我必须在所有70个表实体中为新构造函数传递另一个参数(
    User creator
    )。这是大量添加的代码,我们甚至没有讨论我必须在每个调用站点获取并传递参数的事实
  • 我需要使用DI将当前用户注入任何计划创建新对象的页面模型或控制器
  • 根据我阅读的指南,模型绑定将根据post的参数初始化post上表实体的新实例。这难道不会使用无参数构造函数,从而在Creator中留下空引用吗?如何在这里应用我的业务逻辑?我是否需要自己从POST主体构建实体以利用构造函数中的逻辑
也许这是一个必要的邪恶。它还消除了我的业务逻辑库以前包含的对System.Web的依赖,使它更具可移植性。但是,当我期望DI减少我编写的代码量时,似乎还有很多工作要做。我的期望不正确吗?我忽略了什么吗

我忽略了什么吗

最有可能的是抽象和完全包含DI

(我几乎完全使用它,包括使用它而不是Core的实现,我与该项目没有任何关联)

现在我必须在所有70个表实体中为新构造函数传递另一个参数(User creator)。这是大量添加的代码,我们甚至没有讨论我必须在每个调用站点获取并传递参数的事实

或者您可以使用DI。让DI框架知道所需的参数,并向它索取表格。它应该创建对象并传递所有必要的参数

我需要使用DI将当前用户注入任何计划创建新对象的页面模型或控制器

见上文

根据我阅读的指南,模型绑定将根据post的参数初始化post上表实体的新实例。这难道不会使用无参数构造函数,从而在Creator中留下空引用吗?如何在这里应用我的业务逻辑?我是否需要自己从POST主体构建实体以利用构造函数中的逻辑

见上文


IMHO,DI的全部意义是说这里有我需要的东西,这里有所有这些东西需要的东西,现在把我的目标给我。DI应该处理所有其他问题。

您使用了什么
HttpContext.Current
进行身份验证?ASP.NET Core中的默认DI库是否能够对任意类进行DI?我只能在页面模型和控制器的上下文中找到如何使用它。也许我应该换成Autofac?也许我忽略了某个类和方法?控制器就像其他任意类一样。DI在任何classI中都能正常工作,我更喜欢Autofac,因为它可以很好地隐藏实现。Autofac所做的一切都可以用Core Di完成,但许多事情都需要手动完成。。。(你可以自己做…)顺便说一句,你是对的。我现在在DI火车上。我意识到所有传下来的乏味纯粹是在图书馆里。该库的用户只需使用DI即可获得好处@埃里克菲利普斯