从Autofac

时间:2016-02-18 13:17:00

标签: c# .net dependency-injection autofac .net-assembly

我有一个服务,它从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
    }

0 个答案:

没有答案