c# - 应用设置c#的依赖注入(inject)实现

标签 c# dependency-injection

NotificationHubConnectionSettings.cs 文件以从 web.config 获取连接字符串

  public class NotificationHubConnectionSettings
    {
        public NotificationHubClient Hub { get; set; }
        public NotificationHubConnectionSettings()
        {
            Hub = NotificationHubClient.CreateClientFromConnectionString(ConfigurationManager.AppSettings["Microsoft.Azure.NotificationHubs.ConnectionString"], ConfigurationManager.AppSettings["NotificationHub"]);
        }
    }

Bootstrapper.cs 中 使用 Unity 依赖注入(inject) nuget

  private static IUnityContainer BuildUnityContainer()
        {
            try
            {
                var container = new UnityContainer();

                container.RegisterType<NotificationHubConnectionSettings>().RegisterType<NotificationHubConnectionSettings>(new HierarchicalLifetimeManager());

                return container;

            }
            catch (Exception)
            {
                return null;
            }

        }

HomeController.cs

想实现依赖注入(inject)——

  private readonly NotificationHubClient _hub;

        public HomeController(NotificationHubConnectionSettings hub)
        {
            _hub = hub.Hub;
        }

        // POST api/register
        // This creates a registration id
        public async Task<string> Post(string handle = null)
        {
            string newRegistrationId = null;

            if (handle != null)
            {
                var registrations = await _hub.GetRegistrationsByChannelAsync(handle, 100);

这是实现依赖注入(inject)的正确方法吗?

最佳答案

你应该在这里使用一个接口(interface)类型。

以接口(interface)的形式为 INotificationHubConnectionSettings 类创建契约(Contract),该接口(interface)向您的系统指示所有可用的公共(public)方法和属性。

    public interface INotificationHubConnectionSettings
    {
        NotificationHubClient Hub { get; set; }
    }

然后让您的实际 NotificationHubConnectionSettings 类继承自该接口(interface);

    public class NotificationHubConnectionSettings : INotificationHubConnectionSettings
    {
        public NotificationHubClient Hub { get; set; }
        public NotificationHubConnectionSettings()
        {
            Hub = NotificationHubClient.CreateClientFromConnectionString(ConfigurationManager.AppSettings["Microsoft.Azure.NotificationHubs.ConnectionString"], ConfigurationManager.AppSettings["NotificationHub"]);
        }
    }

现在在 UnityContainer 中注册接口(interface)和类,并将构造函数更改为以下内容;

    private readonly INotificationHubClient _hub;
    public HomeController(NotificationHubConnectionSettings hub)
    {
        _hub = hub.Hub;
    }

始终使用接口(interface)进行依赖注入(inject)。

关于c# - 应用设置c#的依赖注入(inject)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44566471/

相关文章:

c# - Log4Net 不适用于我的海关属性

c# - 第一次出现此错误 - 可访问性不一致

java - 如何将场注入(inject)与 Action 组合一起使用?

spring - 使用 Junit 和 EasyMock 对具有 Autowiring 符号的类进行单元测试?

c# - .NET Core iHostedService 关闭 IIS

c# - 等待 MahApps Metro Dialog 返回结果

c# - VB.NET 是否具有等同于 c# 的多行字符串声明语法?

angular - 尝试手动注入(inject) NgControl 时出现 Lint 警告 "get is deprecated"

c# - PCL 中的 xamarin securestring 等价物