Я вынужден использовать Ninject в проекте, который требует. NET 3.5, и это мешает мне использовать все преимущества автоматического создания фабрики c, которое обеспечивается расширением Factory.
Итак, я быстро реализовал ручную реализацию фабрики, которая должна предоставлять операции, выполняемые по требованию. Для этого я планировал передать имя и аргументы операции фабрике, которая, в свою очередь, должна использовать эти параметры для создания экземпляра со всеми его зависимостями:
public class ServiceOperationFactory : IServiceOperationFactory
{
private static readonly string OP_NAMESPACE = "MyApp.Operations";
private IKernel kernel;
public ServiceOperationFactory(IKernel kernel)
{
this.kernel = kernel;
}
public IServiceOperation Create(string name, object[] args)
{
var opType = Type.GetType( string.Format("{0}.{1}Operation", OP_NAMESPACE, name) );
var argsParam = new ConstructorArgument("args", args);
return kernel.Get(opType, argsParam) as IServiceOperation;
}
}
Вы заметите, что я ввел Ядро в фабрику (Ninject, по-видимому, позволяет мне это делать), чтобы получить экземпляр запрошенной операции со всеми автоматически разрешаемыми зависимостями, и это подход, который предлагается документацией Zenject в Unity при работе с пользовательскими реализациями фабрики.
Это действительно приемлемая практика или скрытый сервисный локатор?