Хотя я нахожу документацию по Autofac (в вики) полезной, разделы, посвященные конфигурации и модулям 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, какие анти-паттерны в конфигурационном файле мне нужны для наблюдения?
Спасибо (я думаю) заранее за ваши ответы.
musicologyman