在C#创建CmdLet中使用DynamicParameter
今天我们介绍PowerShell 命令中另外一种参数
动态参数
所谓动态参数是依据某些特定条件而出现的参数,通常情况下,这些条件包括但不仅限于,特定参数值,特定参数出现,特定参数行为,属性。
我们用一个简单的例子还说明动态参数,这个例子将是下一波PowerShell
扩展中的
Set-SPWebApplicationAuthenticationType
命令
该命令将转换指定的WebApplication
身份验证模式
其中可以转换的为
Classic(经典SharePoint 2010中的身份验证模式)以及Claims(基于声明的身份验证SharePoint
2013中推荐的身份验证)。
首先我们讨论下 关于 转换为 Classic
(经典)
根据微软给出的方法 我们很轻易的得出结论 转化为
Classic 身份验证 从一个命令开发者角度来看 仅仅需要知道一个WebApplication 同时修改其属性就能实现。
我们再来看下 关于转换为
Claims(基于声明的验证)
在转化为Claims 时候 我们需要知道
WebApplication,以及适用该WebApplication的访问账户,该账户对该WebApplication 访问的权限,以及
对应的WebApplication Zone(区域)
不难看出
从一个命令开发者角度去思考我们会得到下表
不难看出
要在一个命令中同时实现转化两种身份验证模式 有两个分支
似乎这两个分支可以使用参数集的方法来解决,
但是仔细考虑下你就会发现一个严重的问题AuthenticationType,以及WebApplication
为这两个分支的公共且必须参数 且转化为 Classic 不再需要任何参数,这就会造成一个问题
参数集界定的十分模糊,虽然从一个开发者本身看这似乎并不是问题,但是该问题对终端用户使用会造成困扰,当他们把 AuthenticationType
参数设置为任意值的时候 都会出现 UserAccountName 等几个参数,但是这几个参数却不是 转化为 Classic
必须的参数甚至这些参数没有任何意义。虽然你可以在帮助中指明用法,但是这种做法并不严谨,而且十分的愚蠢。
我们不妨换个角度用动态参数的办法实现这个目标。
当 AuthenticationType 为
Claims 时候 我们让命令出现 参数3-参数5,
这的确是个好办法,即满足需求,又不会造成困扰,当然我们还可以考量下参数4,参数5
的默认值的可能
进一步简化用户的使用复杂程度。
基于此我们今天将学会如何在使用C#创建Cmdlet
时候使用动态参数
我们先创建该命令,请注意我们要使用IDynamicParameters
然后按照常规思路把
AuthenticationType,WebApplication的参数进行声明
似乎重要的问题来了 动态参数该如何声明
在这里 我们先 声明一个__DyP1 的参数 然后
又写了一个名为Dynamic 的类 而这个类里面 我们看到的确是常规的参数声明, 你似乎对此有怀疑 不要慌张我们继续看
然后我们实现IDynamicParameters
我们验证AuthenticationType
参数当其为Claims 时候 初始化Dynamic类的实例
So。。当Dynamic类实例初始化我们就会同时得到UserName,Zone
等几个参数,
当然我们可以使用下面的方式调用动态参数的值
此后编译,使用该命令
当我们把 AuthenticationType 设为
Classic 时候 我们没有看到 参数3-参数5
当我们把
AuthenticationType 设为 Claims 时候 我们将看到 参数3-参数5
而WebApplication
这个公共参数将同时适用该命令两个分支
---本文档由联科教育(http://www.iLync.cn)田梦博 原创提供,如有问题请电话:021-60745131---
本文出自 “iLync” 博客,请务必保留此出处http://ilync.blog.51cto.com/6203086/1565170