当前位置: 首页 > 知识库问答 >
问题:

关于C中的类型#

袁英豪
2023-03-14

我试图使用C# DI方法来实现一些东西。以下是我的代码片段。

public interface IMessageService
{
    void Send(string uid, string password);
}

public class MessageService : IMessageService
{
    public void Send(string uid, string password)
    {
    }
}

public class EmailService : IMessageService
{
    public void Send(string uid, string password)
    { 
    }
}

以及创建ServiceLocator的代码:

public static class ServiceLocator
{

    public static object GetService(Type requestedType)
    {
        if (requestedType is IMessageService)
        {
            return new EmailService();
        }
        else
        {
            return null;
        }
    }
}

现在,我用创建一个测试代码

public class AuthenticationService
{
    private IMessageService msgService;
    public AuthenticationService()
    {
        this.msgService = ServiceLocator
          .GetService(typeof(IMessageService)) as IMessageService;
    }
}

但看起来,我总是得到GetService()函数返回的null。相反,我希望通过GetService()函数获取EmailServiceobject,那么如何正确地实现呢?

共有2个答案

贺奕
2023-03-14

我试图使用C# DI方法来实现一些东西。以下是我的代码片段

没有称为“C# DI 方法”的模式。我假设我们在这里的任务是为 DI 使用服务定位器模式。别这样!

ServiceLocator可以说是一种反模式,因为类依赖关系是隐藏的,所以会导致维护噩梦。在大多数现实场景中,我们应该避免使用它。

借助一些DI框架,例如SimpleInjector(它可以是任何其他著名的DI框架),您可以获得相同的结果。然而,这一次代码将更易于维护,也更易于测试。为此,我们可以创建一个Mock

但是,让我们回到主题,看看如何在这里使用< code>Simpleinjector:

public class AuthenticationService
{
    private readonly IMessageService _msgService;

    public AuthenticationService(IMessageService msgService)
    {
        this._msgService = msgService;
    }
}

为了在代码中使用它,我们需要注册这个依赖项。一个最小的代码示例是:

var container = new SimpleInjector.Container();
container.Register<IMessageService, EmailService>();
container.Verify();

这就是它所需要的一切!

附言:这不是这个特定DI框架的广告。随意使用任何其他框架,我在这个例子中使用它,因为我更熟悉它

云季同
2023-03-14

您传入的是Type的实例。

因此,请求的此条件类型为 IMessage 服务从来都不是真的

你需要做的是

public static object GetService(Type requestedType)
{
    if (requestedType == typeof(IMessageService))
    {
        return new EmailService();
    }
    else
    {
        return null;
    }
}

顺便提一下,这是一个非常糟糕的模式-您所谓的服务定位器具有具体类型的具体知识。你最好使用反射或一些传统的注册模式,使IoC成为通用的。

 类似资料:
  • 本文向大家介绍关于C++的强制类型转换浅析,包括了关于C++的强制类型转换浅析的使用技巧和注意事项,需要的朋友参考一下 前言 一说起强制类型转换大家都很熟悉,相信很多学习完C++的朋友还在使用C语言的强制类型的方式 (类型)变量. C++其实也具有自己的一套强制类型转换它们分明是:static_cast  reinterpret_cast  const_cast  dynamic_cast四种类型

  • 问题内容: 众所周知,C#提供了一个AS关键字,该关键字会自动执行一次检查,检查对象是否属于某种类型,如果是,则将其强制转换为所需的类型,否则给出null。 在上面的示例中,这里的Object obj可以是User类型或其他类型。用户将获得User类型的对象或null。这是因为C#的As关键字首先执行检查,然后在可能的情况下将对象强制转换为结果类型。 那么Java中有没有与C#的AS关键字等效的关

  • 为什么要在 Car 的无参构造函数中 调用 CTyre(); ???? 就算不写 CTyre(); , 程序也是会默认调用 CTyre 类的无参构造函数的啊 !!!

  • 本文向大家介绍关于C++类的成员初始化列表的相关问题,包括了关于C++类的成员初始化列表的相关问题的使用技巧和注意事项,需要的朋友参考一下 在以下四中情况下,要想让程序顺利编译,必须使用成员初始化列表(member initialization list): 1,初始化一个引用成员(reference member); 2,初始化一个常量对象(const member); 3,调用一个基类的构造函

  • 本文向大家介绍关于C#中排序函数的总结,包括了关于C#中排序函数的总结的使用技巧和注意事项,需要的朋友参考一下 sort 函数对数组中的数据进行升序排序,(其中,sort函数有很多重载的形式,这里不再一一的说明) Reverse函数对数组中的数据进行降序排序, 如何把二个数组联系在一起进行排序操作呢? 例,在学生的信息中有学号和姓名,按学号输出学生的信息怎样实现??? 以上这篇关于C#中排序函数的

  • 下面的代码在无法通过条件颜色时编译。深色和彩色。浅色,因为这两个类是抽象的。 我错过什么了吗?