2013-07-14 29 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不同的实例。

相关问题