我有一个问题,即我有一个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).
任何人都知道为什么它不适合我? :)
答案 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到类时,你有两种方法可以做到:
类构造函数是:
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));