C# 一个组件如何提供其他组件?

C# 一个组件如何提供其他组件?,c#,autofac,C#,Autofac,我想让一个组件在构建后在注册表中注册其他组件。假设我有以下组件: interface IConfiguration { string SourceDirectory { get; } string TargetDirectory { get; } // other primitive-typed configuration parameters } class FileConfiguration : IConfiguration { // read par

我想让一个组件在构建后在注册表中注册其他组件。假设我有以下组件:

interface IConfiguration 
{
    string SourceDirectory { get; }
    string TargetDirectory { get; }

    // other primitive-typed configuration parameters
}

class FileConfiguration : IConfiguration 
{
    // read parameters from some config file
}

class SourceDirectoryWrapper 
{
    public byte[] ReadFile(string filename) 
    {
        // read a file from the source directory
    }

    public string Directory { get; set; }
}

class TargetDirectoryWrapper 
{
    public byte[] WriteFile(string filename) 
    {
        // write a file into the source directory
    }

    public string Directory { get; set; }
}

class DirectoryWrapperFactory 
{
    public DirectoryWrapperFactory(IConfiguration config) 
    {
        var source = new SourceDirectoryWrapper { 
            Directory = config.SourceDirectory 
        };
        var target = new TargetDirectoryWrapper { 
            Directory = config.SourceDirectory 
        };
    }
}
可以像往常一样注册组件
FileConfiguration
DirectoryWrapperFactory

然而,我想要完成的是以某种方式“输出”在
DirectoryWrapperFactory
中创建的
目标
对象。基本思想是,不同的环境可能需要不同的配置提供程序。(即使没有,我认为将读取的配置参数放在一个单独的组件中也是一个好主意。)

我还希望在IoC容器中管理
SourceDirectoryWrapper
TargetDirectoryWrapper
。在我的例子中,主要是为了方便起见,我在任何地方都需要一个
EventSource
实现,所以我使用属性自动连接来注入它。不是IoC容器中的每个对象都需要显式传递,这让我很恼火


那么:AutoFac是否可以实现这一点?如果是,怎么做?我查看了生命周期事件,但大多数都不允许在构建对象后访问注册表。

我不太明白为什么DirectoryWrapperFactory需要存在。您可以直接将SourceDirectoryWrapper和TargetDirectoryWrapper注册为普通wireup的一部分:

builder.Register(c => new SourceDirectoryWrapper { 
        Directory = c.Resolve<IConfiguration>().SourceDirectory 
    });

builder.Register(c => new TargetDirectoryWrapper { 
        Directory = c.Resolve<IConfiguration>().SourceDirectory 
    });
builder.Register(c=>newsourcedirectorywrapper{
Directory=c.Resolve().SourceDirectory
});
寄存器(c=>new TargetDirectoryWrapper{
Directory=c.Resolve().SourceDirectory
});

除了EventSourceProxy实现之外,我正在对所有内容使用程序集扫描。。这完全有可能只是让我没有意识到我可以手动注册其中一些东西。