Довольно новая инъекция зависимостей, и я пытаюсь выяснить, является ли это анти-шаблоном.Инъекция инжектора зависимостей с использованием инъекции зависимостей
Скажем, у меня есть 3 сборки:
Foo.Shared - this has all the interfaces
Foo.Users - references Foo.Shared
Foo.Payment - references Foo.Shared
Foo.Users необходим объект, который построен в Foo.Payment и Foo.Payment также нуждается в вещи из Foo.Users. Это создает некоторую циклическую зависимость.
Я определил интерфейс в Foo.Shared, который проксирует структуру Injection Dependency, которую я использую (в данном случае NInject).
public interface IDependencyResolver
{
T Get<T>();
}
В приложении контейнера, у меня есть реализация этого интерфейса:
public class DependencyResolver:IDependencyResolver
{
private readonly IKernel _kernel;
public DependencyResolver(IKernel kernel)
{
_kernel = kernel;
}
public T Get<T>()
{
return _kernel.Get<T>();
}
}
конфигурация выглядит следующим образом:
public class MyModule:StandardModule
{
public override void Load()
{
Bind<IDependencyResolver>().To<DependencyResolver>().WithArgument("kernel", Kernel);
Bind<Foo.Shared.ISomeType>().To<Foo.Payment.SomeType>(); // <- binding to different assembly
...
}
}
Это позволяет мне создавать новый объект Foo.Payment.SomeType
изнутри Foo.Users без прямой ссылки:
public class UserAccounts:IUserAccounts
{
private ISomeType _someType;
public UserAccounts(IDependencyResolver dependencyResolver)
{
_someType = dependencyResolver.Get<ISomeType>(); // <- this essentially creates a new instance of Foo.Payment.SomeType
}
}
Непонятно, какие именно точные зависимости класса UserAccounts
в этом случае заставляют меня думать, что это не очень хорошая практика.
Как еще я могу это сделать?
Любые мысли?
+1 только для названия языка твистер. – womp
То же самое здесь, мне нравится название :) –