是否有任何具有“子范围”概念的.NET DI容器?
类似的东西:
var container = AppConfiguredContainer();
using(var childContainer = container.GetChild())
{
childContainer.Register<IFoo>(typeof(Foo));
// do stuff with childContainer
}
关键是在子容器中完成的任何服务配置都不会影响应用程序范围的配置。
答案 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.NamedScope
和Ninject.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
的相同实例,但Repository
和ChatService
的实例不同。