コンストラクターによって注入された依存関係を使用している ICommand インターフェイスとタスクがあります。依存関係は異なるコンストラクターを使用しているため、リクエスト自体で解決する必要があります。コンテナが解決されている特定のコンテキストでいくつかの依存関係を解決する方法をコンテナに伝えたいです。
interface ICommand
{
string Do();
}
interface IUser
{
string Name { get; }
}
class Welcome : ICommand
{
IUser _user;
public Welcome(IUser user)
{
_user = user;
}
public string Do()
{
return "Hello, "+_user.Name;
}
}
class OAuthUser : IUser
{
// use remote service to get data
public OAuthUser (IOAuthService service, JsonWebToken token)
{
// to be implemented
}
}
class TemporaryTokenUser : IUser
{
// use sql to check if user has temporary token
public TemporaryTokenUser (IDbConnection db, string token)
{
// to be implemented
}
}
class UserPasswordUser : IUser
{
// try authenticating user with credentials
public UserPasswordUser (IAuthService svc, string user, string password)
{
// to be implemented
}
}
インターフェイスとクラスを LightInject に登録しました。
var container = new LightInject.ServiceContainer();
container.Register<ICommand, Welcome>("welcome");
今、私は自分のリクエストで次のようなことをしたいと思っています:
using (var scope = container.BeginScope())
{
// I need to tell my container how to resolve this dependency in case its needed
// but method below does not exist
scope.ResolverForScope<IUser>(()=>createIUser(request));
var command = container.GetInstance<ICommand>(command);
return command.Do();
}
依存関係チェーンが複雑なメソッドに対して非常に長くなる可能性があることを考えると、DI コンテナーでこれを保守可能な方法で行う正しい方法は何でしょうか?
EDIT ユース ケースをより明確にしました (IUser を実装するクラスを変更しました)。