相关疑难解决方法(0)

C#如何将类“插件”“注册”成服务类?- 截至今日

自从这个问题提出以来已经过去了 6 年,我本来希望今天能有一个简单的解决方案......但似乎没有。

注意:请阅读其他问题以理解这个概念:

几分钟后,我尝试实现一个简单的示例,并且几乎已经完成了。同时我仍然看到一些问题。我想知道是否有人有关于如何让它变得更好的想法。

使用.NET 6(代码如下)。

  • 问题 1:我不喜欢我们所说的泛型,使用TTargetas User,我们还需要传递T ID类型......为什么通过传递User不足以让编译器知道ID数据类型?示例:class UserService : IBaseDBOperation1<User, Guid>为什么不呢class UserService : IBaseDBOperation1<User>

  • 问题2:我知道现在我们可以使用带有代码的方法的接口,但是为什么我们仍然需要用两种数据类型精确地定义变量类型并且使用var还不够?好吧,我们可以使用var,但是这样方法就不可见了。而不是:IBaseDBOperation1<User, Guid> serviceU1 = new UserService();........ var serviceU2 = new UserService();...... 这第二个变量将看不到其他方法。

最后一点:如果 C# 允许我们用多个抽象类扩展一个类,那么一切都会变得容易多了……(截至目前,我们的抽象类仅限于 1 个)。

目标:完成6 年前提出的问题中提出的问题......换句话说......避免复制/粘贴,并以某种方式将多个“操作类”“注入/关联/注册/定义”到服务中....那些“操作类”将在多个不同的服务中大量重用...并且我确实希望有一种“干净/漂亮”的方式来设置它,但同时,消费者不应该担心“较低/更深”的杠杆继承泛型。

代码

public abstract class BaseDBEntry<T> where T : struct
{
    protected BaseDBEntry()
    {
        CreatedOn = DateTime.Now; …
Run Code Online (Sandbox Code Playgroud)

.net c# design-patterns

13
推荐指数
1
解决办法
510
查看次数

从实现类调用C#接口默认方法

C#8支持接口中的默认方法实现。我的想法是将一个日志记录方法注入这样的类中:

public interface ILoggable {
    void Log(string message) => DoSomethingWith(message);
}

public class MyClass : ILoggable {
    void MyMethod() {
        Log("Using injected logging"); // COMPILER ERROR
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个编译器错误:“名称在当前上下文中不存在”

以这种方式使用默认方法实现是不可能的吗?

编辑:

有关C#规则的正确答案,请参见接受的答案。有关更简洁的解决方案(我的问题的初衷!),请参阅下面的答案

c# c#-8.0 default-interface-member

6
推荐指数
4
解决办法
400
查看次数