2013-06-24 2 views
2

У меня возникла проблема, когда у меня есть ссылка на службу WCF и вы хотите ввести ее в контроллеры MVC на клиенте. Это прекрасно работает, когда я не хочу, чтобы задать параметры, но с тех пор я добавил имя пользователя и пароль учетных данных в службу таким образом, они должны быть установлены следующим образом:Unity Не удается найти Конструктор частичного класса

MyServiceRef.ClientCredentials.UserName.UserName = username; 
MyServiceRef.ClientCredentials.UserName.Password = password; 

Я решил попробовать использовать Unity, чтобы справиться с имя пользователя и пароль, создав частичный класс моей служебной ссылки с конструктором с 2 строками в качестве параметров для имени пользователя и pwd и один для isTest (Bool).

public partial class ProductMasterServiceClientClient 
{ 
     public ProductMasterServiceClientClient(string username, string password, bool test) 
     { 
      ClientCredentials.UserName.UserName = username; 
      ClientCredentials.UserName.Password = password; 
     } 
    } 

и настройка Unity так:

container.RegisterType<IProductMasterServiceClient, ProductMasterServiceClientClient>(new InjectionConstructor(new InjectionProperty("username", "test"),new InjectionProperty("password", "password"), new InjectionProperty("test", true))); 

Но он не работает! Я получаю следующее сообщение об ошибке по некоторым причинам :(

The type com.luzern.co40.web.pm.wsProductMasterService.ProductMasterServiceClientClient does not have a constructor that takes the parameters (InjectionProperty, InjectionProperty, InjectionProperty). 

Anyone любая идея, почему ее не работает для меня :)

ответ

3

Попробуйте этот формат:

IUnityContainer container = new UnityContainer().RegisterType<ProductMasterServiceClientClient>(
    new InjectionConstructor(username, password, test)); 
4

Вы вопрос не является WCF родственный , это связано с Единством. Я добавил несколько примеров, которые могут помочь вам создать класс с параметрами.

Регистрация Instance образцы

Это будет регистрировать существующий экземпляр класса в контейнер, любой, кто будет решить для ILogger, получит тот же экземпляр. будут созданы

зарегистрировать тип и класс, на каждый Resolve и новый экземпляр:

container.RegisterInstance(typeof(ILogger), logger); 

Регистрация Тип образцы.

container.RegisterType<ISession, Session>(); 

Для того, чтобы зарегистрировать одноэлементный класс, любой Resolve получит тот же единственный класс EventAggregator использовать время жизни менеджер:

container.RegisterType<ILogger, Logger>(new  ContainerControlledLifetimeManager()); 

• Это конкретный менеджер Lifetime, который создает один экземпляр зарегистрированный тип в контейнере; в целом есть и другие варианты для менеджеров Lifetime

Примеры по регистрации и разрешения:

Когда вы создаете класс и хотите DI контейнер сам к классу по строительству, у вас есть 2 способа сделать это :

  1. Инжектируйте контейнер в конструкторе и сохранить его в качестве частного члена: прописывает (этот пример его одноплодное и конструктор принимает 2 параметр): _container.RegisterType (новый ContainerControlledLifetimeManager());

Конструктор класса:

public SessionProvider(IUnityContainer container) 
    { 
     _container = container; //private IUnityContainer member 
    } 

Когда мы принимаем решение, передать параметр в конструктор в качестве DependecyOverride:

_sessionProvider = _container.Resolve<ISessionProvider>(new DependencyOverride<IUnityContainer>(_container)); 

Дополнительный способ использования контейнера и DI:
Если мы не хотим передавать параметр в конструктор, мы можем использовать их с помощью атрибута [Dependency].
Это позволит создать новый класс Session по каждому решить

container.RegisterType<ISession, Session>(); 

Вместо того, чтобы иметь сеанс (IUnityContainer контейнер) конструктор, мы устанавливаем атрибут в классе:

[Dependency] 
public IUnityContainer Container { get; set; } 

Таким образом, каждый раз, когда контейнер создает новый объект, он устанавливает свойство Container при построении, не передавая его в качестве параметра в Resolve <> . Поэтому нам не нужно объявлять конструктор, контейнер будет создавать экземпляр класса и задавать свойство контейнера при создании экземпляра. Проблема в том, что она должна быть общедоступной.