RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-403369

Lapish's questions

Martin Hope
Lapish
Asked: 2024-05-28 03:52:35 +0000 UTC

禁止同时编辑数据库实体

  • 5

当您需要一个用户同时编辑数据库的一个实体(任何表)时,您会使用什么方法?

  1. 以前,当有人打开一个条目并关闭它时,我通过 bool 变量巧妙地实现了锁定。它有效,但是当启动服务器时,我必须将所有这些字段重置为零,我认为这是不好的做法。现在我可能会通过 Redis 来实现这一点,但我也不完全理解这一点。

  2. CAS(比较和交换)- 存储实体的版本,然后在客户端想要更新它时检查它。我喜欢这个想法,但我不喜欢这样的事实:在保存时,用户可能会发现他的版本已过时并且无法保存数据。在这里,他要么必须重新加载所有输入的数据,要么在选项卡中的旁边显示新数据。总的来说,在我看来,从 UI/UX 的角度来看,让它变得方便是相当困难的,特别是当他在表单上输入十几个字段时。

我在脑海中想象的一个例子:

  1. 用户 A 已打开帖子并正在编辑。时间是否有限,我不知道,但就15分钟吧。
  2. 用户 B 尝试打开同一条记录,并被通知用户 A 当前正在编辑该记录,并且只能以读取模式打开。
  3. 如果对编辑有限制,而且我认为有必要,那么这一次之后用户A就失去了在数据库中保存的能力,需要重新加载编辑页面。可能会不方便,但目前就这样)

PS 标签是有条件的,但堆栈是 C# WPF/Avalonia。

c#
  • 1 个回答
  • 54 Views
Martin Hope
Lapish
Asked: 2023-10-08 00:18:08 +0000 UTC

类命名约定#1

  • 4

您将如何命名/组织以下交互层次结构?如果应用程序完全是本地的并且没有网络部分,那么名称 Response 相关吗?是否可以在 ViewModel 中显示带有响应的类,或者仍然需要对其进行处理以消除响应?最佳实践是什么?

如果您对 User 感到困惑,那么您可以想出任何其他需要生成并批量添加到数据库中的随机类。

让我们有一个特定的用户类。

public class User
{
    public int Age { get; set; }
}

接下来我们有一个生成用户列表的服务:

public class UserService
{
    public IReadOnlyCollection<User> GetUsers()
    {

    }   
}

根据此服务中的数据,我们将数据传输到下一个服务,该服务应将用户集合保存在数据库中。

public class UserProcessingService <-- сервис для работы с бд
{
    public async Task SaveUsersAsync(IReadOnlyCollection<User> users)
    {
        //Сохраняем в бд
    }   
}

由于我们需要将User类保存在数据库中,因此我们至少需要向User类添加Id属性。但是如果我们直接将其添加到 User 中,那么为什么 UserService 应该知道有关数据库及其 id 的信息呢?这是数据层进入业务逻辑的流程。根据我的理解,该服务应该提供尽可能最压缩的类,而没有不必要的属性。所以我创建了一个新类。实体——数据库的实体。

public class UserEntity
{
    public int Id { get; set; }

    public int Age { get; set; }    
}

User 和 UserEntity 具有通用代码,我创建一个接口来同步它们的属性。这两个类现在都实现了这个接口。

public interface IUser
{
    public int Age { get; set; }    
}

现在,在 SaveUsersAsync 方法中,我们将 User 集合传输到 UserEntity 集合并保存它。接下来我想从 UserProcessingService 获取用户集合。让我们创建返回的类:

public class UserResponse : IUser 
{
    public int Id { get; set; }

    public int Age { get; set; } 
}

并更新我们的ProcessingService

public class UserProcessingService
{
    public async Task SaveUsersAsync(IReadOnlyCollection<User> users)
    {
        //Сохраняем в бд
    }   

    //Новый метод
    public async Task<IReadOnlyCollection<UserResponse>> GetUsersAsync()
    {
        //Получаем коллекцию пользователей из бд, маппим и отдаем
    }
}
c#
  • 1 个回答
  • 69 Views
Martin Hope
Lapish
Asked: 2023-09-18 17:45:26 +0000 UTC

覆盖时 sfc 输出不正确

  • 5

当您覆盖“sfc /scannow”命令的输出时,其输出会中断。根据标准,控制台中的输出为 1%..100%,但是当被覆盖时,第一个通知最常出现在 46% 处,并且大量先前的通知立即到达 - 1%..46%。然后又是沉默,又是 91% 和 100% 的通知。此外,这恰恰发生在“sfc /scannow”。另一个命令“ping ya.ru -t”工作正常。

我想以某种方式通知用户进度,而不是等大约一分钟直到 46%,然后再等一分钟,立即 91%、100% 和最终输出......

static async Task Main(string[] args)
{
    ProcessStartInfo proc = new()
    {
        FileName = "sfc",
        Arguments = "/scannow",
        RedirectStandardOutput = true
    };

    Process process = new()
    {
        StartInfo = proc
    };

    process.Start();
    process.OutputDataReceived += Process_OutputDataReceived;
    process.BeginOutputReadLine();
    await process.WaitForExitAsync();

    Console.ReadLine();
}

private static void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    if (!string.IsNullOrEmpty(e.Data) && e.Data != "\0")
    {             
        Console.WriteLine(e.Data);
    }
}

但如果将命令更改为另一个命令,输出将正常工作。

ProcessStartInfo proc = new()
{
    FileName = "ping",
    Arguments = "ya.ru -t",
    RedirectStandardOutput = true
};
c#
  • 1 个回答
  • 42 Views
Martin Hope
Lapish
Asked: 2022-04-04 16:32:06 +0000 UTC

Blazor 范围内的服务生命周期

  • 1

我在blazor上做spa,关闭View并在服务上调用Dispose方法时,并没有完全清除,因为下次切换到同一个View时,不会调用该服务的构造函数。实际项目中的服务被声明为Scoped。创建了最简单的例子。

关于这个例子的一点解释。所有属性都与 ReactiveUI 相关联。有一个主页 - MainView 和第二个 ProfileView,它有一个带有两个选项卡的 TabControl:FirstTabView 和 SecondTabView。所有的 View 都被声明为 Transient 服务,一个 ProfileService 被声明为 Scoped。

主视图行为。

有一个 Number 属性,它在构造函数 (MainViewModel) 中无限递增,直到调用 Dispose 方法。此方法是为瞬态寿命示例而设计的。

个人资料视图行为

在 ProfileService.LoadProfileAsync 服务中调用第一次渲染后 ui(OnAfterRenderAsync) 假加载。加载后,它会显示 ProfileView 的创建时间、服务的创建时间(检查是否每次都创建)以及上次更新的时间。第一个选项卡显示名称作为示例,第二个选项卡显示从 ProfileView 不断更新的连接。

在此处输入图像描述

我的问题

在 TabControl 中的选项卡(First、Second)之间切换时,属性订阅被移除,一切正常,但如果我将 ProfileView 留给 MainView,那么我需要释放 ProfileService 本身,因为我不需要它。它是“释放”的,但是下次它点击 ProfileView 页面时,不会调用此服务的构造函数。并且由于没有从中调用构造函数,所以所有订阅都无法接收到它们的数据,因为在这个服务的 Dispose 方法中,我为每个字段调用了 OnCompleted,也就是我完成了以后的更新。

问题

如果之前调用了Dispose方法,为什么切换到ProfileView时没有调用ProfileService构造函数?

c#
  • 1 个回答
  • 10 Views
Martin Hope
Lapish
Asked: 2022-03-13 14:17:58 +0000 UTC

如果有人已经在编辑元素,则阻止编辑它

  • 0

blazor 上有一个水疗应用程序。如果有人已经在编辑此元素,则需要为其他用户阻止该元素并通知他们。目前有一个想法:

  1. 将列 LockedUserId(由谁)和 LockedTime(何时)添加到实体表。将锁定时间存储在项目配置中。
  2. 加载页面时,用户订阅 hub(signalr) 并特别订阅通知阻塞及其取消的方法。
  3. 如果用户打开元素进行编辑,那么除了 post 方法之外,他还调用了阻塞 signalr 方法。Signalr 向所有人发送阻止通知。
  4. 成功编辑/取消后,用户可能会或可能不会调用所需的 api,但在任何一种情况下都会调用 signalr 方法来释放锁。
  5. 如果与用户的连接丢失或用户重新加载页面,则调用 OnDisconnected 信号器方法并解锁被阻止的实体,并向所有其他用户发送关于释放锁的通知。

这个解决方案是最优的吗?

c#
  • 1 个回答
  • 10 Views
Martin Hope
Lapish
Asked: 2022-08-13 06:11:52 +0000 UTC

对话中的业务逻辑

  • 2

问题是:您是把业务逻辑放在对话框中,还是让它们尽可能简单?

我在 Blazor 上做 SPA。您需要更改授权用户的密码。有一个带有图标的文本字段,单击时会打开一个对话框,您需要在其中输入当前密码和两次新密码。验证成功后,通过 authStateProvider 服务向服务器发送请求(通过 DI 接收)。作为响应,我们收到来自服务器的错误或成功的密码更改。目前,一切都按上述方式进行,但我怀疑对话框应该只是没有任何容器、服务等的愚蠢形式。他们的任务是编辑数据/返回是/否(确认某事时)。

如果您删除对话框中的所有“多余”(服务、发送请求等),并且仅在保存时将成功结果返回给调用表单,那么您将不得不进行无休止的尝试以将密码保存在其中(在表单)(如果用户犯了错误,例如,密码复杂性较弱)。而且由于我们希望在对话框关闭后服务器会做出响应,因此用户会看到不断打开/关闭对话框(正在处理请求并且某些状态如下所示)=> UX 恶化,但在我看来那里没有 SOLID 违规。相反,在第一种情况下,我们违反了 SOLID,但用户很满意。

c#
  • 1 个回答
  • 10 Views
Martin Hope
Lapish
Asked: 2021-10-22 18:44:30 +0000 UTC

从 api 翻译字典

  • 0

我正在为自己创建一个客户端-服务器应用程序,我面前出现了一个问题:“但是从架构的角度来看,实现 jsons 的部分翻译如何‘正确’”。

服务端是java+spring写的,客户端是c#+prism(unity)+refit。

Country 实体的当前代码示例。

在服务器上,代码非常简单:Controller -> Service -> Repository。

在客户端上更有趣一点:

ICountryRepository.cs

public interface ICountryRepository
{
    [Get("/countries/")]
    Task<IReadOnlyCollection<Country>> FindAll();
}

我查看了 UnitOfWork 模式并实际实现了它(好吧,或者我将所有存储库合并为一个),但没有保存所有更改。

存储库服务.cs

public class RepositoryService : IRepositoryService
{
    public ICountryRepository Country { get; }

    public RepositoryService(IAuthenticationService authenticationService)
    {            
        Country = RestService.For<ICountryRepository>(authenticationService.HttpClient);
    }
}

好吧,通过 DI,我获得了这项服务并访问了实体及其方法。在这个阶段,一切都很好。如何实现至少将国家、国籍等的字典实体(字典表)翻译到这个系统中

到目前为止,我想到了 3 个想法:

  1. 将所有词典的翻译存储在服务器上,使用api拉取我需要的翻译,
  2. 在客户端,实现 TranslateService,它将接受原始实体的集合,并在输出中返回已翻译的实体,
  3. 不要为每个存储库创建 RepositoryService,而是创建自己唯一的存储库,其中已经进行了翻译。

虽然我在考虑 1 和 3,但我认为 2 有点不好)也许你有什么想法,但我的方法是完全错误的。

升级版:

很多大公司都不在乎这么一个小细节(同样的steam,没有翻译国家名单的地方),但我还是想)

更新 2

对于一般的查找表,我做了以下操作:在发送数据之前,任何方法都引用从当前会话返回用户设置的组件。在其中,该方法找到当前语言,并根据它发送俄语或英语的集合。

c#
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5