Это плохая практика для создания нового RunSpace из пользовательского C # командлета? - PullRequest
2 голосов
/ 07 ноября 2011

Считается ли плохой практикой (или есть конкретные причины этого не делать) создание нового RunSpace в пользовательском командлете c #?Например, у меня есть пользовательский командлет, как показано ниже, и мне нужно вызвать существующий командлет, и мне интересно, возникнут ли какие-либо потоки или другие проблемы с этим.

 public class SPCmdletNewBusinessSite : SPNewCmdletBase<SPSite>
    {

...
     private void ExecuteRunspaceCommand()
            {
                Runspace runspace = RunspaceFactory.CreateRunspace();
                PSSnapInException snapInError;
                runspace.RunspaceConfiguration.AddPSSnapIn("Microsoft.SharePoint.PowerShell", out snapInError);
                runspace.ThreadOptions = PSThreadOptions.Default;
                runspace.Open();

                Pipeline pipeline = runspace.CreatePipeline();

                Command newSiteProc = new Command("New-SPSite");
                newSiteProc.Parameters.Add(new CommandParameter("Url", "http://goober-dc/9393"));
                newSiteProc.Parameters.Add(new CommandParameter("OwnerAlias", "GOOBER\\Administrator"));
                newSiteProc.Parameters.Add(new CommandParameter("Template", "STS#1"));
                newSiteProc.Parameters.Add(new CommandParameter("Language", "1033"));
                newSiteProc.Parameters.Add(new CommandParameter("ContentDatabase", "Site_Specific_ContentDB"));

                pipeline.Commands.Add(newSiteProc);
                Collection<PSObject> results = new Collection<PSObject>();

                results = pipeline.Invoke();
                foreach (PSObject obj in results)
                {
                    base.WriteObject(((SPSite)obj.BaseObject).RootWeb.Title);
                }                  

            }
}

В частности, я хочу создать SPSite для SharePoint 2010 и указать конкретную базу данных контента для SPSite.Существует перегрузка для SPSitesCollection.Add (), которая принимает SPContentDatabase в качестве параметра, но это внутренний метод.Я хочу создать RunSpace, чтобы разрешить вызов командлета New-SPSite (который позволяет указывать новую базу данных контента) и, следовательно, иметь возможность создавать сайт с определенной базой данных контента.

Я обнаружил, http://msdn.microsoft.com/en-us/library/ms714873(v=VS.85).aspx указывает, что вы можете вызывать командлеты из командлетов, но New-SPSite (фактический класс SPCmdletNewSite) также является внутренним и не может быть вызван напрямую.

1 Ответ

2 голосов
/ 08 ноября 2011

Если вы хотите вызвать другой командлет внутри командлета, обычной практикой является использование вложенного конвейера , а не нового пространства выполнения.Это позволяет вам использовать область действия командлета, предоставляя вам доступ к тем же переменным и контексту.Новое пространство выполнения является полностью изолированным и в результате является более тяжелым, но может быть желательным, если вы не загрязняете область вызова.Я думаю, что вам, вероятно, нужен вложенный конвейер, поэтому вам не нужно перезагружать оснастку sharepoint (я предполагаю, что она уже загружена при вызове нового командлета sharepoint.)

Этот метод можно использовать изкомандлет.Это вложенный конвейер, потому что ваша команда уже выполняется в конвейере.

var pipe = Runspace.DefaultRunspace.CreateNestedPipeline(...);
pipe.Invoke()

http://msdn.microsoft.com/en-us/library/system.management.automation.runspaces.runspace.createnestedpipeline(v=VS.85).aspx

...