2017-02-20 28 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(); 
    } 
}