【问题标题】:Unity Cannot find Constructor of partial classUnity找不到部分类的构造函数
【发布时间】:2013-06-25 16:12:23
【问题描述】:

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

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

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

有人知道为什么它不适合我吗? :)

【问题讨论】:

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


    【解决方案1】:

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

    注册实例样本

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

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

    注册类型样本:

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

    container.RegisterType<ISession, Session>();  
    

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

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

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

    注册和解析示例:

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

    1. 在构造函数中注入容器并将其保存为私有成员: 我们注册(这个例子它的单例和构造函数有 2 个参数): _container.RegisterType(new 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>();
    

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

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

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

    【讨论】:

      【解决方案2】:

      试试这个格式:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多