Unity无法找到分类的构造函数

时间:2013-06-24 11:26:11

标签: c# wcf dependency-injection unity-container

我有一个问题,即我有一个WCF服务引用,并希望将其注入客户端的MVC控制器。当我不想指定参数时,这可以正常工作,但我已经为服务添加了用户名和密码凭据,因此必须这样设置:

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

我决定尝试使用Unity来处理用户名和密码,方法是使用构造函数创建我的服务引用的部分类,其中2个字符串作为username和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).

任何人都知道为什么它不适合我? :)

2 个答案:

答案 0 :(得分:4)

你的问题与WCF无关,它与Unity有关。 我添加了一些可能有助于您创建带参数的类的示例。

注册实例样本

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

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

注册类型示例:

在每个Resolve上注册一个类型和类,将创建新实例。

container.RegisterType<ISession, Session>();  

为了注册单例类,任何Resolve都将使用生命周期管理器接收相同的单个EventAggregator类:

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

•这是一个特定的Lifetime管理器,它在容器中创建一个已注册类型的实例;一般来说,终身经理还有其他选择

注册和解析的示例:

当你创建一个类并希望在构造时将容器本身DI到类时,你有两种方法可以做到:

  1. 在构造函数中注入容器并将其另存为私有成员: 我们注册(这个例子它的单例和构造函数有2个参数): _container.RegisterType(new ContainerControlledLifetimeManager());
  2. 类构造函数是:

     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>();
    

    我们在类中设置属性,而不是使用Session(IUnityContainer容器)构造函数:

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

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

答案 1 :(得分:3)

请尝试以下格式:

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