stevenjin 2024-12-23 15:29 采纳率: 96.8%
浏览 5
已结题

asp.net core mvc中将要注入的类,用构造函数传递使用会有问题吗

1.在移植wpf程序中的代码时,由于启动任务的部分写在了ViewModel的类中,在这个类会调用另一个类,这个类负责业务逻辑。会拼装命令,下发到执行具体命令的类的方法体中。
2.在负责业务逻辑的类中,注入执行具体命令的类时报错,只能放弃。
暂时解决办法:在控制器方法中,调用ViewModel时从其构造传递负责具体读写命令的类,这个类紧接着通过构造函数传入负责业务逻辑的类进行使用。
疑问:这种做法会影响性能吗?求正确方案!

  • 写回答

1条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2024-12-23 15:35
    关注
    让【道友老李】来帮你解答,本回答参考通义千问大模型编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    ### 问题分析

    在WPF应用程序中,ViewModel通常负责处理用户界面的逻辑,并且可能会调用业务逻辑层(通常是服务类)来执行具体的业务操作。业务逻辑层再调用数据访问层或命令执行层来完成实际的操作。

    在你描述的情况下,你在ViewModel中调用了业务逻辑类,而业务逻辑类需要依赖于一个具体执行命令的类。你尝试通过依赖注入的方式来传递这个依赖,但遇到了一些问题。作为临时解决方案,你选择直接在ViewModel的构造函数中传递这个依赖,并将其传递给业务逻辑类。

    临时方案的影响

    性能影响

    1. 构造函数链:通过构造函数传递依赖会导致构造函数链变长,这可能会增加对象创建时的复杂性。但这通常不会对性能产生显著影响,除非构造函数中包含大量的计算。
    2. 依赖管理:直接在构造函数中传递依赖会使得代码更加耦合,维护起来可能会更困难。这并不是性能问题,但会影响代码的可读性和可维护性。

    正确方案

    为了更好地管理和解耦依赖关系,建议使用依赖注入容器(如Microsoft.Extensions.DependencyInjection、Autofac等)。以下是使用依赖注入容器的步骤和示例代码。

    正确方案步骤

    1. 安装依赖注入库: 你可以使用NuGet包管理器安装Microsoft.Extensions.DependencyInjection或其他依赖注入库。

      Install-Package Microsoft.Extensions.DependencyInjection
      
    2. 配置依赖注入容器: 在应用程序启动时配置依赖注入容器,注册所有需要的服务。

    3. 修改ViewModel和业务逻辑类: 修改ViewModel和业务逻辑类,使其通过构造函数接受依赖。

    4. 使用依赖注入容器解析对象: 使用依赖注入容器来解析ViewModel和其他服务。

    示例代码

    假设你的项目结构如下: - ICommandExecutor:命令执行接口 - CommandExecutor:具体命令执行类 - IBusinessLogic:业务逻辑接口 - BusinessLogic:具体业务逻辑类 - MyViewModel:ViewModel类

    1. 定义接口和实现类

    public interface ICommandExecutor
    {
        void ExecuteCommand(string command);
    }
    
    public class CommandExecutor : ICommandExecutor
    {
        public void ExecuteCommand(string command)
        {
            // 执行命令的逻辑
        }
    }
    
    public interface IBusinessLogic
    {
        void DoSomething();
    }
    
    public class BusinessLogic : IBusinessLogic
    {
        private readonly ICommandExecutor _commandExecutor;
    
        public BusinessLogic(ICommandExecutor commandExecutor)
        {
            _commandExecutor = commandExecutor;
        }
    
        public void DoSomething()
        {
            // 业务逻辑
            _commandExecutor.ExecuteCommand("SomeCommand");
        }
    }
    

    2. 配置依赖注入容器

    using Microsoft.Extensions.DependencyInjection;
    
    public class App
    {
        public static IServiceProvider ConfigureServices()
        {
            var serviceCollection = new ServiceCollection();
    
            // 注册服务
            serviceCollection.AddSingleton<ICommandExecutor, CommandExecutor>();
            serviceCollection.AddSingleton<IBusinessLogic, BusinessLogic>();
            serviceCollection.AddSingleton<MyViewModel>();
    
            return serviceCollection.BuildServiceProvider();
        }
    }
    

    3. 修改ViewModel

    public class MyViewModel
    {
        private readonly IBusinessLogic _businessLogic;
    
        public MyViewModel(IBusinessLogic businessLogic)
        {
            _businessLogic = businessLogic;
        }
    
        public void StartTask()
        {
            _businessLogic.DoSomething();
        }
    }
    

    4. 使用依赖注入容器解析对象

    var serviceProvider = App.ConfigureServices();
    var viewModel = serviceProvider.GetService<MyViewModel>();
    
    // 启动任务
    viewModel.StartTask();
    

    总结

    通过使用依赖注入容器,你可以更好地管理和解耦依赖关系,提高代码的可维护性和可测试性。虽然直接在构造函数中传递依赖是一种可行的临时方案,但使用依赖注入容器是更推荐的做法。这样可以避免构造函数链过长的问题,并且使得代码更加清晰和易于维护。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月31日
  • 已采纳回答 12月23日
  • 修改了问题 12月23日
  • 创建了问题 12月23日