我有一个关于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() …
我们已经将Redis会话状态提供程序实现到我们的Web应用程序,它就像一个魅力,但我想知道如果redis服务器出现故障或Web服务器无法连接到redis服务器会发生什么.
有没有办法使用InProc会话状态管理作为Redis的故障转移?我找不到任何关于声明多个会话状态提供程序的文档,因此如果redis失败,系统可以继续使用inproc.(我接受在redis中丢失会话状态并在发生故障时从头开始并且再次丢失会话状态inproc并且如果redis可用则再次从头开始)
我正在尝试使用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) 在我的应用程序中,我使用 Material 3 进行主题化。我使用 Material Theme Builder 在 Figma 创建了一个主题,并将生成的代码添加到我的应用程序中。但有一些事情我不知道如何实现。例如,材质主题生成器创建包含六种不同颜色的表面色调调色板。
例如,我想使用“Surface at + 1”颜色,它使表面颜色与原色协调一致。但生成的代码不包含任何像 surface1 这样的属性,并且harmonizeWith属性没有按预期工作。
你有什么建议吗?
我在Eclipse和Team Explorer Everywhere中遇到了一些问题.
我安装并向Eclipse添加了一个服务器.但现在我无法添加新的服务器.因为,服务器按钮被禁用.

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