【发布时间】:2011-04-25 17:07:21
【问题描述】:
虽然我通常发现 Autofac 文档(在 wiki 上)很有帮助,但关于 XML 配置和模块的部分对我来说有点不清楚。现在,我有一个示例工作(我将在下面介绍),但我不确定它是否代表 Autofac 上下文中的一种混蛋配置方法。特别是,我不确定配置文件和代码文件中是否有我真正需要的内容。
代码如下:
using System;
using System.IO;
using Autofac;
using Autofac.Configuration;
namespace AutofacTest.Animals
{
interface IAnimal
{
void Speak ( );
}
abstract class Animal : IAnimal
{
protected TextWriter Writer
{
get;
private set;
}
protected Animal ( TextWriter writer )
{
this.Writer = writer;
}
public abstract void Speak ( );
}
class Dog : Animal
{
public Dog ( TextWriter writer )
: base ( writer )
{
}
public override void Speak ( )
{
this.Writer.WriteLine ( "Arf!" );
}
}
class Cat : Animal
{
public Cat ( TextWriter writer )
: base ( writer )
{
}
public override void Speak ( )
{
this.Writer.WriteLine ( "Meow" );
}
}
// In actual practice, this would be in a separate assembly, right?
class AnimalModule : Module
{
protected override void Load ( ContainerBuilder builder )
{
builder.RegisterInstance ( Console.Out ).As<TextWriter> ( ).SingleInstance ( );
builder.Register ( d => new Dog ( d.Resolve<TextWriter> ( ) ) ).As<IAnimal> ( );
}
}
class Program
{
static void Main ( )
{
Console.ForegroundColor = ConsoleColor.Yellow;
ContainerBuilder builder = new ContainerBuilder ( );
ConfigurationSettingsReader reader = new ConfigurationSettingsReader();
builder.RegisterModule ( reader );
//builder.RegisterModule ( new AnimalModule ( ) );
builder.Build ( ).Resolve<IAnimal> ( ).Speak ( );
Console.ReadKey ( );
}
}
}
这是一个相关的配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
</configSections>
<autofac defaultAssembly="AutofacTest">
<components>
<component
type="AutofacTest.Animals.Cat"
service="AutofacTest.Animals.IAnimal" />
<component type="System.IO.StreamWriter" service="System.IO.TextWriter">
<parameters>
<parameter name="path" value="C:\AutofacTest.txt"/>
<parameter name="append" value="false" />
</parameters>
<properties>
<property name="AutoFlush" value="true" />
</properties>
</component>
</components>
<modules>
<module type="AutofacTest.Animals.AnimalModule, AutofacTest"/>
</modules>
</autofac>
</configuration>
这一切都很好。应用程序将“喵”输出到文本文件。如果我注释掉组件元素,应用程序会输出“Arf!”到控制台。
那么,这里一切都好吗?或者有没有更好的方法来解决这个问题?
而且我有点不确定基于模块的配置背后的想法:
我是否正确,在实际实践中,模块应该与应用程序的其余部分位于不同的程序集中?
我是否正确理解模块的主要功能之一是为 DI 容器提供一组默认配置设置?
理想情况下,我的配置文件应该有多大?换句话说,在使用 Autofac 时,我需要注意哪些配置文件反模式?
提前感谢(我认为)您的回复。
音乐家
【问题讨论】:
-
只是一个提醒,可以节省其他人的时间和精力 - 在 AutoFac 4.0 中,这不再有效。有关如何使用配置,请参阅 4.0 版的文档。
标签: autofac