2013-06-24 60 views
2

我有一个问题,我有一个WCF服务引用,并希望将其注入到客户端的MVC控制器中。这工作得很好,当我不想指定参数,但因为我已经添加用户名和密码凭据的服务,所以这些都必须这样设置,如:Unity无法找到部分类的构造函数

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

我决定尝试使用统一处理用户名和密码通过创建我的服务引用的部分类与构造函数与2个字符串作为用户名和密码的参数,一个isTest(布尔)。

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

,并建立统一,像这样:

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). 

任何为什么它不是为我工作的任何想法:)

回答

3

试试这个格式:

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

你的问题是不相关的WCF ,这是一个与Unity相关的问题。 我添加了一些样本,可以帮助您创建一个带参数的类。

注册实例样本

这将注册一个现有的类实例的容器,任何人都将解析ILogger,会得到相同的实例。

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

注册类型的样本:

注册类型和类别,每个决心和新的实例将被创建。

container.RegisterType<ISession, Session>(); 

为了注册一个单独的类,任何解决将收到相同的单EventAggregator类用一生的时间管理:

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

•这是创建的单一实例特定终身经理容器中的注册类型;一般有终身经理在注册和解析

例子其它选项:

当你创建一个类,并希望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]属性对它们进行DI。
这将创建每一个新的Session类解决

container.RegisterType<ISession, Session>(); 

取代具有会话(IUnityContainer容器)构造函数中,我们设置属性类:

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

这样一来,每次容器创建新对象时,它将在构造时设置Container属性而不将其作为参数传递给Resolve <> 因此,我们不需要声明构造函数,容器将实例化一个类并在实例化时设置容器属性。问题是它必须是公开的。

相关问题