首页 > 解决方案 > 依赖注入 - 目录注入一个类到另一个类

问题描述

我有一个具有以下结构的 MailRepository 类:

public class MailRepository : IMailRepository
{
    public MailRepository()
    {
    }

    public async Task SendMail(string subject, string content, string recipientAddress)
    {  
    }
}

我还有一个带有以下代码的 LocalizationReposiory 类:

public class LocalizationRepository : ILocalizationRepository
{
    private readonly IStringLocalizer<LocalizationRepository> _localizer = null;
    public LocalizationRepository(IStringLocalizer<LocalizationRepository> localizer)
    {
        _localizer = localizer;
    }

    public string TranslateSetting(string settingName, params string[] additionalParams)
    {
        return _localizer.GetString(settingName, additionalParams);
    }
}

这就是我从一个类中调用 MailRepository 中的SendMail方法的方式:

var subject = _localizationRepository.TranslateSetting("Subject");
var content = _localizationRepository.TranslateSetting("Body");
await _mailRepository.SendMail(subject, content, "xyz@yahoo.com");

这是启动中的依赖注入的样子:

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddSingleton<IMailRepository>(services => new MailRepository());
        builder.Services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });
        builder.Services.Configure<RequestLocalizationOptions>(opts =>
        {
            var supportedCultures = new List<CultureInfo>
                    {
                        new CultureInfo("en-US")
                    };
            opts.DefaultRequestCulture = new RequestCulture("en-US");
            opts.SupportedCultures = supportedCultures;
            opts.SupportedUICultures = supportedCultures;
        });
        builder.Services.AddSingleton<ILocalizationRepository, LocalizationRepository>();
    }
}

有没有办法将 LocalizationRepository 直接注入 MailRepository 以避免在多个类中重复以下代码行?

var subject = _localizationRepository.TranslateSetting("Subject");
var content = _localizationRepository.TranslateSetting("Body");
await _mailRepository.SendMail(subject, c,ontent "xyz@yahoo.com");

标签: c#dependency-injection

解决方案


注入ILocalizationRepository_MailRepository

public MailRepository(ILocalizationRepository localizationRepo)
{
   //set private var
}

然后更改您在服务提供商中的注册方式

builder.Services.AddSingleton<IMailRepository, MailRepository>();

推荐阅读