为了账号安全,请及时绑定邮箱和手机立即绑定

如何将类注册为接口但调用方法?

如何将类注册为接口但调用方法?

C#
胡说叔叔 2023-07-23 16:51:43
我复制了下面的代码,它工作得很好,但我已经修改了它以满足我的需要,通过将 I 添加到当前名称来创建一个具有DatabaseSettings相同UserSettings后缀的接口。但问题是它试图将接口注册为接口,这是错误的?在进行更改之前,settings变量只有两个条目,现在我已经添加了接口,settings正在拾取接口(因为后缀),因此它现在具有条目,而不是将它们添加为条目,我想将它们与相应的类一起使用并仍然调用.LoadSection(type)public class SettingsModule : Module{    private readonly string _configurationFilePath;    private readonly string _sectionNameSuffix;    public AeSettingsModule(string configurationFilePath, string sectionNameSuffix = "Settings")    {        _configurationFilePath = configurationFilePath;        _sectionNameSuffix = sectionNameSuffix;    }    protected override void Load(ContainerBuilder builder)    {        var settings = Assembly.Load(nameof(DataLayer))            .GetTypes()            .Where(t => t.Name.EndsWith(_sectionNameSuffix, StringComparison.InvariantCulture))            .ToList();         settings.ForEach(type =>         {             builder.Register(c => c.Resolve<ISettingsReader>().LoadSection(type))             .As(type)             .SingleInstance();         });    }}public class DatabaseSettings: IDatabaseSettings{    public string ConnectionString { get;  set; }    public int TimeoutSeconds { get; set; }}public interface IDatabaseSettings{    string ConnectionString { get; set; }    int TimeoutSeconds { get; set; }}我收到的错误消息是:`System.MissingMethodException: 'Cannot create an instance of an interface.'`因为我已经将`构造函数注入从类更改为接口:public UserService(IDatabaseSettings databaseSettings, IUserSettings userSettings){    ...}因为我已经添加了接口并且它具有相同的前缀&ldquo;设置&rdquo;,所以它选择了我不想要的接口,而是我想将它与相应的类一起使用?我正在尝试执行此操作(但使用上面的语法,因为我LoadSection也想调用):builder.RegisterType<DatabaseSettings>().As<IDatabaseSettings>();
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

我通过反复试验找到了一个解决方案,该应用程序按预期工作,但我不确定它是否高效、可靠等。


我发帖只是为了获得反馈,如果它有效,其他人也许可以使用它。


var settings = Assembly.Load(nameof(DataLayer))

    .GetTypes()

    .Where(t => t.Name.EndsWith(_sectionNameSuffix, StringComparison.InvariantCulture ) && !t.IsInterface)

    .ToList();


    settings.ForEach(type =>

    {

        builder.Register(c => c.Resolve<ISettingsReader>().LoadSection(type))

            .As(type.GetInterfaces())

            .AsImplementedInterfaces()

            .InstancePerLifetimeScope();

    });


查看完整回答
反对 回复 2023-07-23
  • 1 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信