2

我有一个问题,我有一个 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).

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

4

2 回答 2

4

您的问题与 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; }

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

于 2013-06-25T08:12:23.057 回答
3

试试这种格式:

IUnityContainer container = new UnityContainer().RegisterType<ProductMasterServiceClientClient>(
    new InjectionConstructor(username, password, test));
于 2013-06-24T14:11:51.980 回答