Unity找不到分部类的构造函数

本文关键字:构造函数 找不到 Unity | 更新日期: 2023-09-27 18:19:44

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

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

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

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

Unity找不到分部类的构造函数

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

注册实例示例

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

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

寄存器类型示例:

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

container.RegisterType<ISession, Session>();  

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

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

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

注册和解析示例:

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

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

类构造函数是:

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

当我们解析时,将参数作为DependencyOverride:传递给构造函数

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

使用容器和DI的其他方法:
如果我们不想将参数传递给构造函数,我们可以使用[Dependency]属性对它们进行DI
这将在每个解析上创建一个新的会话类

container.RegisterType<ISession, Session>();

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

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

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

尝试以下格式:

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