2013-07-14 58 views
1

是否有任何.NET DI容器具有「子範圍」的概念?是否有允許使用「子範圍」的DI容器?

喜歡的東西:

var container = AppConfiguredContainer(); 

using(var childContainer = container.GetChild()) 
{ 
    childContainer.Register<IFoo>(typeof(Foo)); 

    // do stuff with childContainer 
} 

的一點是,在子容器進行服務的任何配置將不會影響應用程序級的配置。

+1

嘗試Ninject - 不是100%確定它。 –

+0

Unity - [使用子容器](http://msdn.microsoft.com/en-us/library/dn178463(v = pandp.30).aspx#sec25) –

+0

你想達到什麼目的?大多數容器都有一個功能調用「範圍生活方式」,在大多數情況下都具有相同的效果。對於其他情況:在應用程序啓動階段之後,您不應該進行任何註冊。我甚至讀過KrzysztofKoźmic的博客文章,他很遺憾將這個功能添加到溫莎城堡,所以我認爲這樣的功能確實值得懷疑。 – Steven

回答

0

這是孩子用示波器結合NInject的例子:

var k = new StandardKernel(); 
k.Bind<Application>().ToSelf().InSingletonScope().DefinesNamedScope("Application"); 
k.Bind<UserRepository>().ToSelf().InNamedScope("Application"); 

const string userScopeName = "User"; 
k.Bind<UserScope>().ToSelf().DefinesNamedScope(userScopeName); 
k.Bind<User>().ToSelf().InNamedScope(userScopeName); 
k.Bind<User.ChatService>().ToSelf().InNamedScope(userScopeName); 
k.Bind<User.SheetService>().ToSelf().InNamedScope(userScopeName); 

const string nestedScopeName = "UserSheet"; 
k.Bind<User.Sheet>().ToSelf().DefinesNamedScope(nestedScopeName); 
k.Bind<User.Sheet.SheetInfo>().ToSelf().InNamedScope(nestedScopeName); 
k.Bind<User.Sheet.SheetCalculator>().ToSelf().InNamedScope(nestedScopeName); 

您需要引用Ninject.Extensions.NamedScopeNinject.Extensions.FactoryNinject.Extensions.ContextPreservatioon

每個Repository可以將多個用戶和他們每個人都會有多個Sheets在「子範圍」:

public class UserRepository 
{ 
    Func<UserScope> _factory; 

    [Inject] 
    public UserRepository(Func<UserScope> factory) 
    { 
     _factory = factory; 
    } 

    public UserScope LoadUser() 
    { 
     return _factory(); // scopes preserved 
    } 
} 


public class User 
{ 
    Func<Sheet> _sheetFactory; // multiple instances inside User scope 
    public UserRepository Repository { get; } // same instance for app 
    [Inject] 
    public User(Func<Sheet> sheetFactory, UserRepository repository) 
    { 
     Repository = repository; 
     _sheetFactory = sheetFactory; 
    } 

    public Sheet MakeSheet() 
    { 
     return _sheetFactory(); 
    } 
} 

使用UserScope類作爲容器User是很重要的,否則你無法解析的User從依賴內部的同一個實例:

public class UserScope : IDisposable 
{ 
    [Inject] 
    public UserScope(User user, IResolutionRoot resolver) 
    { 
     User = user; 
     Resolver = resolver; 
    } 

    public User User { get; } 
    public IResolutionRoot Resolver { get; } // you can use this to resolve anything from inside **this** user scope 
} 

然後你就可以加載用戶,如:

var app = k.Get<Application>(); // singleton 
var u1 = app.Repository.LoadUser(); 
var u2 = app.Repository.LoadUser(); 

而且他們每個人都會有ApplicationRepository相同的實例但ChatServiceSheetService不同的實例。

相關問題