【发布时间】:2023-03-25 14:41:01
【问题描述】:
我有一个遗留库,它获取所有实现IFoo<T> 的类,将它们实例化为单例,并执行它们的Execute 方法。
我需要有一个短暂的生命周期,并且实现的构造函数通过 DI 注入并且仍然使其与旧系统兼容。但是我不能碰遗留库。
所以我的想法是使用表示瞬态生命周期的相同方法创建一个接口ISuperFoo<T>,并在编译时生成IFoo<T> 包装器,该包装器在每次执行时通过我们的依赖注入框架实例化一个超级foo,并且由旧版库自动拾取。
我一直在研究,似乎可以通过 Roslyn 来做到这一点,在编译时生成代码,就像创建异步/等待状态机时一样。
发现了类似的老问题,但想知道现在是否可以使用https://www.nuget.org/packages/CodeGeneration.Roslyn.BuildTime。
基本上我有:
interface IFoo<T>
{
void Execute(T obj);
}
在编译时我想生成类似的东西:
[EditorBrowsable(false)]
class FooWrapper<T> : IFoo<T>
{
Container _container;
public FooWrapper(Container container)
=> _container = container;
public void Execute(T obj)
=> _container
.GetInstance<ISuperFoo<T>>()
.Execute(obj);
}
容器可以被注入,因为它无论如何都是单例的。
【问题讨论】:
-
顺便说一句,
ServiceLocator不是 DI。你没有注射任何东西。是的,它“有点”是 IoC,但实际上它是一种反模式。对于您的问题:您可能正在寻找像 Fody 或 PostSharp 这样的 IL 编织。 -
公平点。我只是想展示问题的简化。我会看看那些谢谢。
-
你不能使用 Harmony 或 Fody 之类的东西吗? github.com/pardeike/Harmony/wiki