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

我复制了下面的代码,它工作得很好,但我已经修改了它以满足我的需要,通过将 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>();


胡说叔叔
浏览 98回答 1
1回答

幕布斯6054654

我通过反复试验找到了一个解决方案,该应用程序按预期工作,但我不确定它是否高效、可靠等。我发帖只是为了获得反馈,如果它有效,其他人也许可以使用它。var settings = Assembly.Load(nameof(DataLayer))&nbsp; &nbsp; .GetTypes()&nbsp; &nbsp; .Where(t => t.Name.EndsWith(_sectionNameSuffix, StringComparison.InvariantCulture ) && !t.IsInterface)&nbsp; &nbsp; .ToList();&nbsp; &nbsp; settings.ForEach(type =>&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; builder.Register(c => c.Resolve<ISettingsReader>().LoadSection(type))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .As(type.GetInterfaces())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .AsImplementedInterfaces()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .InstancePerLifetimeScope();&nbsp; &nbsp; });
打开App,查看更多内容
随时随地看视频慕课网APP