是否有允许使用“子范围”的DI容器?

时间:2013-07-14 17:34:34

标签: c# dependency-injection

是否有任何具有“子范围”概念的.NET DI容器?

类似的东西:

var container = AppConfiguredContainer();

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

  // do stuff with childContainer
}

关键是在子容器中完成的任何服务配置都不会影响应用程序范围的配置。

1 个答案:

答案 0 :(得分:0)

以下是与NInject绑定的子范围的示例:

Module._compile

您需要使用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.Factory

每个Ninject.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(); Application的相同实例,但RepositoryChatService的实例不同。