Asp.net核心中的条件依赖性解析 [英] Conditional Dependency Resolving in Asp.net core

查看:95
本文介绍了Asp.net核心中的条件依赖性解析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有2个控制器PayerController和BusinessController。
两个Controller构造函数都将EntityManager作为参数,这是一个抽象类。
我想根据我使用的控制器来解析每个Manager类。

I am having a 2 controller PayerController and BusinessController. Both Controller constructors takes EntityManager as a parameter which is an abstract class. I would like to resolve Each Manager class depending on the controller I am using.

对于PayerController,我想注入PayerManager类,对于BusinessController,我想要注入BusinessManager。

For PayerController I would like to inject PayerManager class and for BusinessController I would like to inject BusinessManager.

当前,我正在使用EntityManager解析的最后一个对象,即BusinessManager。

Currentlly I am getting the last Object that has been resolved with EntityManager i.e BusinessManager.

我记得在Ninject中我们可以很容易地进行条件注入。

I remember in Ninject we can do conditional injection pretty easily.

这就是我目前正在解决的问题依赖关系,但不起作用。

This is how current I am resolving the dependency But wont work.

Startup.cs

services.AddScoped(typeof(EntityManager), typeof(PayerManager));
services.AddScoped(typeof(EntityManager), typeof(BusinessManager));

控制器

public class PayerController
{
   private PayerManager Manager{get;}
   public PayerController(EntityManager entityManager)
   {
      Manager = entityManager as PayerManager;
   }
}

经理班

public class PayerManager : EntityManager
{
    public void MyPayer()
    {
    }  
}

public class BusinessManager : EntityManager
{
    public void MyBusiness()
    {
    }
}

public abstract class EntityManager
{
    public string IAMCommon()
    {
        return "";
    }
}


推荐答案

I不明白为什么您认为在这种情况下需要条件依赖注入,因为使其工作的解决方案非常简单。

I don't understand why you think you need conditional dependency injection in this situation because the solution to make it work is very simple.

您可以更改控制器以注入正确的

You can change your controllers to inject the correct type of dependency that they need.

public class PayerController
{
   private PayerManager Manager { get; }

   public PayerController(PayerManager manager)
   {
      Manager = manager;
   }
}

public class BusinessController
{
   private BusinessManager Manager { get; }

   public BusinessController(BusinessManager manager)
   {
      Manager = manager;
   }
}

然后确保两种类型均已在服务容器中注册

Then make sure both types are registered in the service container.

services.AddScoped<PayerManager>();
services.AddScoped<BusinessManager>();

更新

一种更好的方法是使用接口,也可能使用抽象的通用控制器。

A better way is to use interfaces and possibly an abstract generic controller.

定义接口:

public interface IEntityManager { }
public interface IPayerManager : IEntityManager { }
public interface IBusinessManager : IEntityManager { }

更新您的类以实现接口:

Update your classes to implement the interfaces:

public abstract class EntityManager : IEntityManager 
{ 
    protected EntityManager() { }
}

public class PayerManager : EntityManager, IPayerManager 
{ 
    public PayerManager() : base() { }
}

public class BusinessManager : EntityManager, IBusinessManager 
{ 
    public BusinessManager() : base() { }
}

然后创建一个基本控制器类:

Then create a base controller class:

public abstract class EntityController<T> : Controller where T : class, IEntityManager
{
    protected(T manager)
    {
        Manager = manager
    }

    protected T Manager { get; }
}

更改控制器以从基本控制器继承:

Change your controllers to inherit from base controller:

public class PayerController : EntityController<IPayerManager>
{
   public PayerController(IPayerManager manager) : base(manager) { }
}

public class BusinessController : EntityController<IBusinessManager>
{
   public BusinessController(IBusinessManager manager) : base(manager) { }
}

并更新服务注册:

services.AddScoped<IPayerManager, PayerManager>();
services.AddScoped<IBusinessManager, BusinessManager>();

这篇关于Asp.net核心中的条件依赖性解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆