2017-02-20 3 views
1

У меня есть несколько динамических модулей в моем приложении. У меня есть настройки для каждого из них. Я хочу зарегистрировать настройки для каждого модуля до начала работы модуля. Я нашел метод InstancePerMatchingLifetimeScope, но у меня нет идеи, как он может работать.Autofac InstancePerMatchingLifetimeScope

using System; 
using Autofac; 

public class Program 
{ 
    public static void Main() 
    { 
     var builder = new ContainerBuilder(); 
     builder.RegisterType<Settings1>().InstancePerMatchingLifetimeScope("1").As<ISettings>(); 
     builder.RegisterType<Settings2>().InstancePerMatchingLifetimeScope("2").As<ISettings>(); 

     var container = builder.Build(); 


     using (var lifetimeScope = container.BeginLifetimeScope("1")) 
     { 
      lifetimeScope.Resolve<ISettings>().Run(); 
     } 

     using (var lifetimeScope = container.BeginLifetimeScope("2")) 
     { 
      container.Resolve<ISettings>().Run(); 
     } 
    } 
} 


public interface ILog 
{ 
    void Run(); 
} 

public interface ISettings 
{ 
    void Run(); 
} 

public class Log : ILog 
{ 
    public void Run() 
    { 
     Console.WriteLine("Log"); 
    } 
} 

public class Settings1 : ISettings 
{ 
    public void Run() 
    { 
     Console.WriteLine("Settings1"); 
    } 
} 


public class Settings2 : ISettings 
{ 
    public void Run() 
    { 
     Console.WriteLine("Settings2"); 
    } 
} 

Пример https://dotnetfiddle.net/cEw90l

Кто-то есть идея, как она должна работать?

ответ

1

Я нашел решение. https://dotnetfiddle.net/fLZz4E. Метод BeginLifetimeScope позволяет добавлять новые регистрации, и вы можете использовать эти регистрационные данные в своей области

public static void Main() 
{ 
    var builder = new ContainerBuilder();  

    var container = builder.Build(); 


    using (var lifetimeScope = container.BeginLifetimeScope(c => c.RegisterType<Settings1>().As<ISettings>())) 
    { 
     lifetimeScope.Resolve<ISettings>().Run(); 
    } 

    using (var lifetimeScope = container.BeginLifetimeScope(c => c.RegisterType<Settings2>().As<ISettings>())) 
    { 
     lifetimeScope.Resolve<ISettings>().Run(); 
    } 
}