Я немного сбит с толку относительно того, почему вы сначала пытаетесь выполнить базовое разрешение, а затем - средство разрешения единства. Как правило, если вы собираетесь заменить базовые реализации своими собственными, обе решат, но ваша должна быть первой, чтобы был возвращен экземпляр вашего переопределяющего класса. Например, скажем, вы хотите переопределить IConnectionIdFactory
в SignalR. Вы можете создать свой собственный класс, который наследуется от данного интерфейса, а затем зарегистрировать его в Unity. Тогда ваш распознаватель зависимостей должен иметь возможность разрешать данную зависимость и возвращать ее, никогда не касаясь распознавателя SignalR. Я собрал небольшое тестовое приложение, и мой распознаватель зависимостей выглядит так:
Respendancy Resolver:
public class UnityResolver : DefaultDependencyResolver
{
private readonly IUnityContainer _container;
public UnityResolver(IUnityContainer container)
{
_container = container;
}
public override object GetService(Type serviceType)
{
if (_container.IsRegistered(serviceType))
{
return _container.Resolve(serviceType);
}
return base.GetService(serviceType);
}
public override IEnumerable<object> GetServices(Type serviceType)
{
if (_container.IsRegistered(serviceType))
{
return _container.ResolveAll(serviceType);
}
return base.GetServices(serviceType);
}
}
Важно с единицей проверить, есть ли у нас путь разрешения, так как Resolve
сгенерирует исключение, если оно не существует.
Для полноты картины приведем реализацию:
ConnectionIDFactory:
public class ConnectionIdFactory : IConnectionIdFactory
{
public string CreateConnectionId(IRequest request)
{
return Guid.NewGuid().ToString();
}
}
Регистрация:
public class Bootstrapper
{
public static void Pre_Start()
{
Container.DefaultContainer.Instance.RegisterType(
typeof(IConnectionIdFactory),
typeof(Repositories.ConnectionIdFactory),
null,
new Microsoft.Practices.Unity.ContainerControlledLifetimeManager());
AspNetHost.SetResolver(new Resolvers.UnityResolver(Container.DefaultContainer.Instance));
}
}