2015-01-30 4 views
1

Привет Я использую единства в WebAPI 1.0 и зарегистрирован под Global.asax.vb файла, как показано нижеКак Inject параметр конструктору, используя единство

Dim container As IUnityContainer = New UnityContainer() 

container.RegisterType(Of Car)(New InjectionConstructor(GetType(Integer)))

Теперь как я передать целое число значение, которое передается клиентским приложением в типе автомобиля, используя

Public Sub New(ByVal intUserId As Int32) 
    objCar = DependencyResolver.Current.GetService(Of car)()  

End Sub 

не можете найти что-нибудь, чтобы использовать (ParameterOverride («intUserId», intUserId) в DependencyResolve r

+0

Ваш тип регистрации также неправильный. –

+0

Использование интерфейса - это необходимо? – Gauls

+0

интерфейс или абстрактный класс. Как иначе это будет считаться зависимостью? –

ответ

1

Это очень похоже на регистрацию контейнера единичных объектов с помощью ASP.NET MVC. Хотя web api имеет другую линию выполнения. Следуй этим шагам.

NB: Я преобразовал этот код из C# в VB с помощью конвертера. Поэтому я надеюсь, что это синтаксически правильно. Хотя это точно в C#.

1) Реализовать IDependencyResolver (Убедитесь, что вы правильно разрешением имен здесь. IDependencyResolver должен исходить от System.Web.Http.Dependencies. Обратите внимание на ввезенных пространства имен.

Imports System.Collections.Generic 
Imports System.Linq 
Imports System.Web 
Imports Microsoft.Practices.Unity 
Imports System.Web.Http.Dependencies 

Namespace YourNamespace.Framework 
    Public Class UnityApiDependencyResolver 
     Implements IDependencyResolver 

     Private _container As IUnityContainer = Nothing 

     Public Sub New(container As IUnityContainer) 
      Me._container = container 
     End Sub 

     Public Function GetService(serviceType As Type) As Object 
      Try 
       Return _container.Resolve(serviceType) 
      Catch generatedExceptionName As Exception 

       Return Nothing 
      End Try 
     End Function 

     Public Function GetServices(serviceType As Type) As IEnumerable(Of Object) 
      Try 
       Return _container.ResolveAll(serviceType) 
      Catch generatedExceptionName As Exception 

       Return Nothing 
      End Try 
     End Function 

     Public Function BeginScope() As IDependencyScope 
      Return Me 
     End Function 

     Public Sub Dispose() 
      ' 
     End Sub 
    End Class 
End Namespace 

'======================================================= 
'Service provided by Telerik (www.telerik.com) 
'Conversion powered by NRefactory. 
'Twitter: @telerik 
'Facebook: facebook.com/telerik 
'======================================================= 

2) Настройте свой контейнер либо через конфигурацию конфигурации, либо через код.

3) Зарегистрировать контейнер в Global.asax.vb файл

Dim container = New UnityContainer() 
Dim section As UnityConfigurationSection = TryCast(ConfigurationManager.GetSection("unity"), UnityConfigurationSection) 

section.Configure(container, "UnitySection") 

'api dependency resolver 
GlobalConfiguration.Configuration.DependencyResolver = New UnityApiDependencyResolver(container) 

'======================================================= 
'Service provided by Telerik (www.telerik.com) 
'Conversion powered by NRefactory. 
'Twitter: @telerik 
'Facebook: facebook.com/telerik 
'======================================================= 

это так. Теперь вы можете объявить зависимость в любом из контроллера API, и он будет впрыскивается единства

Public Sub New(repositoryFactory As IRepositoryFactory, serviceFactory As IServiceFactory) 
    Me.repositoryFactory = repositoryFactory 
    Me.serviceFactory = serviceFactory 
End Sub 

'======================================================= 
'Service provided by Telerik (www.telerik.com) 
'Conversion powered by NRefactory. 
'Twitter: @telerik 
'Facebook: facebook.com/telerik 
'======================================================= 

Ваша регистрация типа неправильно, а также. вы должны указать либо интерфейс, либо абстрактный класс, как зависимость, и его конкретную реализацию как его отображение.

container.RegisterType например (Из IContext, Context)()

Я не понимаю, что пытаются достичь путем сопоставления целочисленное значение автомобиля. Вы хотите, чтобы объект автомобиля загружался на основе целочисленного значения в вашем параметре?

+0

К сожалению, мне нужно использовать объект concreate и не иметь выбора. Выше код - всего лишь пример кода, в котором мне нужно создать объект автомобиля, а конструктор принимает идентификатор пользователя в качестве параметра – Gauls

+0

В этом случае вам действительно не нужен блок там. Единство (или любой контейнер DI, если на то пошло) было бы полезно, если бы у вас был интерфейс ICAR, и у вас было несколько реализаций ICar, но в тот момент времени вы не знали фактической реализации, тогда вы могли бы разрешить его тип там, но, конечно же, вы не можете запросить использование идентификатора. это не так, как работает DI. –

+0

Справа я получу соответствующего разработчика проекта для создания интерфейса. Итак, что, если есть два конструктора, которые принимают некоторую ценность int и другие некоторые объекты, как указать, какой из них использовать для создания экземпляров? контейнер.RegisterType (Of ICar) (новый объект InjectionConstructor (GetType (Integer))) и помещает фактический конструктор как Gauls

Смежные вопросы