gpt4 book ai didi

c# - 如何避免 .net 扩展方法中的服务定位器

转载 作者:太空狗 更新时间:2023-10-29 22:22:57 27 4
gpt4 key购买 nike

我正在寻找一种干净的模式来在 .Net 扩展方法中使用依赖项,而无需显式更新或使用服务定位器:

public static class HttpContextExtensions
{
public static SomeClass ExtensionMethod(this HttpContext context)
{
//looking to avoid this
var dependency = ServiceLocator.GetService<DependencyType>();
return dependency.DoSomething(context);
}
}

我是不是找错人了?我是否应该寻找将 context 传递给方法的更直接的解决方案?如果可能,我想继续使用扩展程序。

最佳答案

在 Mark Seemann 的“Dependency Injection in .NET”一书中,在第 2 章中,他谈到了 4 种不同的注入(inject)模式:

  1. 构造函数注入(inject)
  2. 属性注入(inject)
  3. 方法注入(inject)
  4. 环境语境

第四个,Ambient Context,是静态属性,可以是抽象类型。该属性可以在 DI Root、线程上下文、调用上下文、请求上下文等中设置。.NET 安全、交易和其他类似的东西使用这种模式。

以下链接将为您提供更多详细信息:

下面是一些示例代码:

public interface IOutput
{
void Print(Person person);
}

public class ConsoleOutput : IOutput
{
public void Print(Person person)
{
Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
}
}

public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}

public static class SampleContext
{
public static IOutput Output { get; set; }
}

public static class ExtensionMethods
{
public static void Print(this Person person)
{
SampleContext.Output.Print(person);
}
}

static class Program
{
static void Main()
{
//You would use your DI framework here
SampleContext.Output = new ConsoleOutput();

//Then call the extension method
var person = new Person()
{
FirstName = "Louis-Pierre",
LastName = "Beaumont"
};

person.Print();
}
}

关于c# - 如何避免 .net 扩展方法中的服务定位器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16741876/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com