我有一个服务,它从Assembly
的基本目录中加载文件:
// pseudo
class FileLoaderService : IFileLoader {
var _baseAssembly;
.ctor(Assembly baseAssembly) {
_baseAssembly = baseAssembly;
}
Stream LoadFile(string name) {
return GetFileStream(_baseAssembly.Location + path);
}
}
此服务正被注入位于不同程序集中的各种其他已解析服务(某些程序在编译期间未知,但在运行时加载)。现在,我想在解析IFileLoader
时将当前程序集(例如,已解析的目标类型所在的程序集)作为参数提供。
我尝试了两种方法,使用工厂代理和FileLoaderService
注册ResolvedParameter
,但两者都只提供当前IComponentContext
,但不提供有关目标类型的任何信息注射剂。
我正在寻找的东西是这样的:
containerBuilder.Register(context => {
var targetType = context.Target.TargetType; // does not exist
var hostingAssembly = targetType.Assembly;
return new FileLoaderService(hostingAssembly);
}).As<IFileLoader>();
我在其他IoC容器中看到了类似的功能,例如Ninject(例如,当前的RequestContext提供了'Target'属性),所以我希望这也可以在Autofac中实现。 :)
// pseudo
class SomeTypeInAnotherAssembly
.ctor(IFileLoader loader) {
var fileStream = loader.LoadFile("test.png");
// the file stream is now loaded from the base directory of AnotherAssembly.dll
// since the injected IFileLoader was constructed using the assembly
// of SomeTypeInAnotherAssembly
}