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(); 
    } 
}