小编bah*_*lan的帖子

在.Net中使用接口进行标准化

我有一个关于OOP和界面的奇怪问题,这些问题在试图找到最佳设计时搞砸了我的想法.

有两个不同的类在不同的环境中进行相同的工作(例如发送消息).这两个环境使用不同的参数来定义接收者; 一个使用邮件地址,另一个使用用户名.因此,这两个类具有相同但略有不同的发送消息的方法.

MessageSenderViaMailManager.cs

public bool SendMessage(string recipientMailAddress, string message) {
..
}
Run Code Online (Sandbox Code Playgroud)

MessageSenderViaUsernameManager.cs

public bool SendMessage(string recipientUserName, string message) {
..
}
Run Code Online (Sandbox Code Playgroud)

这两个类中还有其他类似的方法,负责相同的工作,但可能需要不同的参数.为了使这些管理器可以使用接口,我创建了一个名称为IMessageSenderManager并包含这样的定义的管理器.

public bool SendMessage(string recipientUserName, string recipientMailAddress, string message);
Run Code Online (Sandbox Code Playgroud)

所以我的类中的SendMessage方法都改为:

public bool SendMessage(string recipientUserName,string recipientMailAddress, string message) {
 ..
}
Run Code Online (Sandbox Code Playgroud)

使用这个新的SendMessage方法,我可以使用适当的参数作为收件人(邮件地址或用户名).这似乎没问题,但实现看起来很奇怪.因为我必须发送所有参数,而不知道在编码时将在运行时使用哪些参数.例如:

// Sending message via username implementation
string userName = GetUserNameFromSomeWhere();
string mailAddress = GetUserMailFromSomeWhere();
IMessageSenderManager manager = MessageSenderFactory();
manager.SendManager(userName, mailAddress, "This messaged sent by your user name");
Run Code Online (Sandbox Code Playgroud)

与上面的代码一样,通过邮件地址发送消息看起来类似

在我看来,这不是一个好的设计,所以我开始考虑更好的解决方案.如果我想实现另一个为收件人使用不同描述符的MessageSender提供程序,我必须添加另一个参数到我的接口,所以对所有类.我想,我可以用一个通用收件人参数更改两个收件人参数,并为上下文发送适当的值.但我试图在动态环境中使用它,并且(通过用户名或邮件)的方式将在运行时确定,所以我无法使用它.

我正在计划这个,一个灵活的库,可以为其他开发人员使用解耦或单元测试友好,我不想将它们与无意义的参数或糟糕的设计混淆.

对于像这样的情况有没有更好的设计?

编辑:

实际上,由于我的错误,我忘记了我的问题中非常重要的一部分,我很抱歉.从答案中可以看出,有一些替代方案可以解决我上面描述的第一个问题.但是之后?我在代码中提到过,接口是从MessageSenderFactory() …

c# oop interface

6
推荐指数
1
解决办法
254
查看次数

ASP.Net会话状态提供程序故障转移方案

我们已经将Redis会话状态提供程序实现到我们的Web应用程序,它就像一个魅力,但我想知道如果redis服务器出现故障或Web服务器无法连接到redis服务器会发生什么.

有没有办法使用InProc会话状态管理作为Redis的故障转移?我找不到任何关于声明多个会话状态提供程序的文档,因此如果redis失败,系统可以继续使用inproc.(我接受在redis中丢失会话状态并在发生故障时从头开始并且再次丢失会话状态inproc并且如果redis可用则再次从头开始)

asp.net session session-state inproc redis

6
推荐指数
1
解决办法
680
查看次数

使用Autofac将NLog注入Web Api控制器

我正在尝试使用Autofac添加NLog我的Web Api项目。但是我有问题。

从NuGet安装NLog软件包后,我将以下文件添加到我的项目中。(由于遵循不同的帖子和示例,可能会造成混淆)

ILogger.cs

 public interface ILogger {
        void Debug(string message);
        void Trace(string message);
        void Info(string message);
        void Warning(string message);
        void Error(string message);
        void Error(string message, Exception exception);
        void Fatal(string message);
        void Fatal(string message, Exception exception);
    }
Run Code Online (Sandbox Code Playgroud)

LoggerAttribute.cs

[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Class)]
    public class LoggerAttribute : Attribute {
        public readonly string Name;

        public LoggerAttribute(string name) {
            Name = name;
        }
    }
Run Code Online (Sandbox Code Playgroud)

NLogger.cs

public class NLogger : ILogger {
        private readonly NLog.Logger logger;

        public NLogger(Type loggerType) {
             logger = LogManager.GetLogger(loggerType.FullName);
        }

        public …
Run Code Online (Sandbox Code Playgroud)

nlog autofac asp.net-web-api

3
推荐指数
1
解决办法
4391
查看次数

如何在 Flutter 中使用 Material 3 表面色调?

在我的应用程序中,我使用 Material 3 进行主题化。我使用 Material Theme Builder 在 Figma 创建了一个主题,并将生成的代码添加到我的应用程序中。但有一些事情我不知道如何实现。例如,材质主题生成器创建包含六种不同颜色的表面色调调色板。

例如,我想使用“Surface at + 1”颜色,它使表面颜色与原色协调一致。但生成的代码不包含任何像 surface1 这样的属性,并且harmonizeWith属性没有按预期工作。

你有什么建议吗?

material-design flutter material-design-3

3
推荐指数
1
解决办法
1684
查看次数

Eclipse和Team Explorer Everywhere问题

我在Eclipse和Team Explorer Everywhere中遇到了一些问题.

我安装并向Eclipse添加了一个服务器.但现在我无法添加新的服务器.因为,服务器按钮被禁用.

替代文字

我想知道,我该如何添加新服务器?

eclipse tfs team-explorer tfs2010

2
推荐指数
1
解决办法
1842
查看次数