【问题标题】:Reliable way to get the type of class from within a service, instantiated through .Net Core DI从服务中获取类类型的可靠方法,通过 .Net Core DI 实例化
【发布时间】:2020-02-04 21:11:55
【问题描述】:

本质上,我希望能够确定我的服务中调用者类的命名空间。服务实例化使用默认的 ASP.NET Core DI 进行。可能会出现进一步的障碍,因为我想在基类的构造函数中确定调用者,而不是直接在实例化的服务中。

我怀疑我知道我的问题的答案,但如果它真的发生了,那也不会是我见过的更疯狂的事情了。

编辑

示例代码

// First caller
namespace Example.Assembly.One
{
    public class CallerOne
    {
        consctructor(Service service)

        void WhichCallerAmI() { return this.service.ReturnCaller() }
        ...
    }   
}

// Second caller
namespace Example.Assembly.Two
{
    public class CallerTwo
    {
        consctructor(Service service)

        void WhichCallerAmI() { return this.service.ReturnCaller() }
        ...
    }   
}


// Service
namespace Example.Service
{
    public class Service : BaseService
    {
        consctructor() : base()

        public void ReturnCaller()
        {
            if (this.namespace == "Example.Assembly.One")
            {
                return "First caller";
            }

            return "Second caller";
        }  
    }   
}

// Base service
namespace Example.Service
{
    public class BaseService
    {
        consctructor(Service service)
        {
            // Determine namespace of caller here
            this.namespace = <insert-answer-here>
        }
    }   
}

// demo
// These callers can be controllers or other services
var firstCaller = new CallerOne() 
var secondCaller = new CallerTwo();

// firstResult now contains "First Caller"
var firstResult = firstCaller.WhichCallerAmI();

// secondResult now contains "Second Caller";
var secondResult = secondCaller.WhichCallerAmI();

XY 问题

示例中的 Callers 表示单独的微服务 Web 项目中的数据服务,每个项目都使用单独的数据库。我试图解决的问题是为一个实体重用相同的服务代码,在所有或部分单独的数据库中重复。我的想法是根据调用者类的命名空间注入相关的DbContext,因为无论哪种方式我们都遵循严格的命名约定。

【问题讨论】:

  • 这可能是XY problem。提供minimal reproducible example 以阐明您的特定问题或添加其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
  • 你为什么关心这个?这反转依赖注入。你想解决的真正问题是什么?在运行时执行此操作的简单方法是使用例如StackTrace 来查找调用方法,但为什么要这样做?如果调用者的类型很重要,为什么不将其作为泛型类型参数传递?

标签: asp.net-core dependency-injection


【解决方案1】:

所以你有一个类:

public class Consumer
{
    public Consumer(Provider provider)
    {
        // ...
    }
}

并且这个类有如下依赖:

public class Provider : BaseProvider
{
    public Provider()
        : base()
    {
        // ...
    }
}

而且这个依赖有一个基类:

public class BaseProvider
{
    public BaseProvider()
    {
        // ...
    }
}

现在在BaseProvider 的构造函数中,您想知道它正在为哪个调用者初始化?

你不能。

依赖注入框架将在实例化Consumer之前初始化Provider 服务。因此,您将无法获取此信息,尤其是无法从堆栈跟踪中获取。

这是一个 XY 问题。如果您需要知道 正在调用一个类,那么您做错了什么。您可能正在寻找的是Provider 中的参数化构造函数,根据需要它的人使用不同的参数调用它,以改变其行为。但这完全是一个不同的问题。

对于后者,例如参见.NET Core DI, ways of passing parameters to constructor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2022-08-10
    相关资源
    最近更新 更多