2011-04-20 1 views
2

위키에서 Autofac 문서가 도움이된다는 사실을 발견했지만, XML 설정과 모듈에 관한 부분은 다소 불분명합니다. 이제는 샘플을 사용해 보았지만 (아래에서 설명 함) Autofac 컨텍스트 내에서 구성에 대한 일종의 저속한 접근 방식인지 여부는 확실하지 않습니다. 특히 설정 파일과 코드 파일에 실제로 필요한 것이 더 많거나 적은지 잘 모르겠습니다.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> 

이. 응용 프로그램에서 "Meow"를 텍스트 파일로 출력합니다. 구성 요소를 주석 처리하면 응용 프로그램이 "Arf!"를 출력합니다. 콘솔에.

그럼 모든 것이 여기에 있습니까? 아니면 이것에 대해 더 좋은 방법이 있습니까?

그리고 모듈 기반 구성 뒤에 사고에 대해 조금 확실 해요 :

내가, 실제 상황에서, 모듈은 응용 프로그램의 나머지 부분에서 별도의 어셈블리에 있어야한다는 수정 있습니까?

모듈의 주요 기능 중 하나가 DI 컨테이너의 기본 구성 설정 집합을 제공한다는 점을 올바르게 알고 있습니까?

이상적으로, 설정 파일은 얼마나 확장되어야합니까? 즉, Autofac을 사용할 때 내가 감시해야 할 설정 파일 방지 패턴은 무엇입니까?

미리 답변 해 주셔서 감사합니다.

musicologyman

+1

단지 알림 -이 더 이상 * * 유효하지 않습니다 AutoFac 4.0을. 구성 사용 방법은 버전 4.0 설명서를 참조하십시오. – codeputer

답변

4

내 개인적인 추천은 드물게 XML 구성을 사용하는 것입니다. 재 컴파일없이 재구성해야하는 부분에 대해서만 사용할 것입니다. 재사용 가능한 라이브러리를 구축하는 경우, 예를 들어 모 놀리 식 웹 애플리케이션을 구축하는 것보다 더 많은 기능을 제공 할 것입니다.

[AttributeUsage(AttributeTargets.Class)] 
[MeansImplicitUse] 
public class RegisterServiceAttribute : Attribute 
{ 
} 

참고 : MeansImplicitUse가 ReSharper에서에서입니다 RegisterServiceAttribute 내 루트 프로젝트의 속성이

public static void AutoRegister(ContainerBuilder builder, params Assembly[] assemblies) 
{ 
    builder.RegisterAssemblyTypes(assemblies) 
     .Where(t => t.GetCustomAttributes(typeof (RegisterServiceAttribute), false).Any()) 
     .AsSelf() 
     .AsImplementedInterfaces(); 
} 

: 내가하려고 다른 것은이 코드를 사용하여 내 유형의 대부분의 자동 등록 가능하게하다 .

나는 자동 등록을 원하는 클래스에 [RegisterService]을 넣습니다. 최소한 95 %의 등록이이 방법으로 처리됩니다. 나머지 등록은 AutoRegister()로 전화 한 후에 발생합니다.

+0

감사합니다, Jim, 답장을 보내 주셔서 감사합니다. 나는 당신의 추천이 우리가하려는 것을 어떻게 생각 하는지를 생각할 필요가있다. – musicologyman

+0

일부 응용 프로그램을 XML 및 기타 코드에 등록 할 수 있습니까? –

4

예를 들어 예상 한 동작이 100 % 확실하지 않습니다. 사용자가 동일한 구성 요소 집합을 여러 번 등록하는 것처럼 보입니다. 의도가 있다면이 제안을 무시하십시오.

  • 모듈을 XML로 등록하면 모듈 내에 구성 요소를 등록 할 필요가 없습니다.
  • 마찬가지로 모듈을 XML로 등록하면 코드에 모듈을 등록 할 필요가 없습니다.

'모범 사례'에 대해서는 Jim의 권장 사항이 간과하지 않고 XML을 사용하는 것이 좋습니다. 개인적으로 필자는 모듈 내부의 모든 무거운 작업을 수행하고 XML을 통해 모듈을 등록하여 거기에 적용 할 수있는 구성을 활용하는 경향이 있습니다.

또 다른 권장 사항은 XML을 사용하여 모듈을 구성하는 것입니다. 귀하의 예에서는 구성 요소에 구성을 설정하고 있습니다. 매개 변수를 모듈에 적용한 다음 해당 모듈의 내부에서 필요에 따라 구성 요소에 매개 변수를 전달하면 구성이 약해집니다. 구성 요소는 구성을 변경하지 않고도 변경이 가능해야하지만 모듈은 매우 많이 휘젓는 경향이 없습니다.

HTH,

닉 다른 사람의 시간과 노력을 절약 할 수 있습니다