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).
有人知道为什么它不适合我吗?:)
您的问题与WCF无关,而是与Unity有关。我添加了一些示例,这些示例可能有助于创建带有参数的类。
注册实例示例
这将把一个现有的类实例注册到容器中,任何解析为ILogger的人都将获得相同的实例。
container.RegisterInstance(typeof(ILogger), logger);
寄存器类型示例:
注册一个类型和类,在每个Resolve上都会创建新的实例。
container.RegisterType<ISession, Session>();
为了注册单例类,任何Resolve都将接收相同的单个EventAggregator类。请使用生命周期管理器:
container.RegisterType<ILogger, Logger>(new ContainerControlledLifetimeManager());
•这是一个特定的Lifetime管理器,它在容器中创建注册类型的单个实例;一般来说,终身管理还有其他选择
注册和解析示例:
当您创建一个类并希望在构建时将容器本身DI到该类时,有两种方法可以实现:
- 在构造函数中注入容器并将其另存为私有成员:我们注册(在这个例子中,它的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));