這是孩子用示波器結合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.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
和SheetService
不同的實例。
嘗試Ninject - 不是100%確定它。 –
Unity - [使用子容器](http://msdn.microsoft.com/en-us/library/dn178463(v = pandp.30).aspx#sec25) –
你想達到什麼目的?大多數容器都有一個功能調用「範圍生活方式」,在大多數情況下都具有相同的效果。對於其他情況:在應用程序啓動階段之後,您不應該進行任何註冊。我甚至讀過KrzysztofKoźmic的博客文章,他很遺憾將這個功能添加到溫莎城堡,所以我認爲這樣的功能確實值得懷疑。 – Steven