Я также изучаю Amazon Managed Blockchain, хотя его в предварительном просмотре. Надеюсь, я смогу помочь вам в вашем вопросе. mspid не является параметром для отправки в запросе. Похоже, что вы что-то упустили в файле конфигурации. Можете ли вы выслать мне содержимое файла конфигурации ниже?
cat ~/non-profit-blockchain/tmp/connection-profile/ngo-connection-profile.yaml
При просмотре содержимого файла конфигурации очевидно, что значение mspid отсутствует в файле конфигурации. ID поставщиков услуг членства (MSP) - это обязательное значение, которое должно быть установлено в конфигурации. Вы также можете подтвердить это с помощью команды ниже.
cat ~/non-profit-blockchain/tmp/connection-profile/ngo-connection-profile.yaml | grep mspid:
Если он показывает пустое значение, вам нужно установить mspid в файле конфигурации. Убедитесь, что переменные среды, упомянутые в ~/non-profit-blockchain/ngo-fabric/fabric-exports.sh
, установлены правильно. Если этот файл отсутствует, используйте ~/non-profit-blockchain/ngo-fabric/templates/exports-template.sh
. Вам необходимо установить значение переменной среды $ {MEMBERID} в mspid в ngo-connection-profile.yaml, также посмотрите, отсутствует ли какое-либо другое обязательное значение поля в файле конфигурации. Вы также можете увидеть детали значений, которые необходимо заменить в файле конфигурации, из сценария ниже. ~/non-profit-blockchain/ngo-rest-api/connection-profile/gen-connection-profile.sh
. Позвольте мне перечислить их.
sed -i "s|%PEERNODEID%|$PEERNODEID|g" $REPODIR/tmp/connection-profile/ngo-connection-profile.yaml
sed -i "s|%MEMBERID%|$MEMBERID|g" $REPODIR/tmp/connection-profile/ngo-connection-profile.yaml
sed -i "s|%CAFILE%|$LOCALCA|g" $REPODIR/tmp/connection-profile/ngo-connection-profile.yaml
sed -i "s|%ORDERINGSERVICEENDPOINT%|$ORDERINGSERVICEENDPOINT|g" $REPODIR/tmp/connection-profile/ngo-connection-profile.yaml
sed -i "s|%ORDERINGSERVICEENDPOINTNOPORT%|$ORDERINGSERVICEENDPOINTNOPORT|g" $REPODIR/tmp/connection-profile/ngo-connection-profile.yaml
sed -i "s|%PEERSERVICEENDPOINT%|$PEERSERVICEENDPOINT|g" $REPODIR/tmp/connection-profile/ngo-connection-profile.yaml
sed -i "s|%PEERSERVICEENDPOINTNOPORT%|$PEERSERVICEENDPOINTNOPORT|g" $REPODIR/tmp/connection-profile/ngo-connection-profile.yaml
sed -i "s|%PEEREVENTENDPOINT%|$PEEREVENTENDPOINT|g" $REPODIR/tmp/connection-profile/ngo-connection-profile.yaml
sed -i "s|%CASERVICEENDPOINT%|$CASERVICEENDPOINT|g" $REPODIR/tmp/connection-profile/ngo-connection-profile.yaml
sed -i "s|%ADMINUSER%|$ADMINUSER|g" $REPODIR/tmp/connection-profile/ngo-connection-profile.yaml
sed -i "s|%ADMINPWD%|$ADMINPWD|g" $REPODIR/tmp/connection-profile/ngo-connection-profile.yaml
После установки значений и проверки остановите узел или завершите процесс, запущенный на порте 3000, и снова запустите узел. cd ~ / non-profit-blockchain / ngo-rest-api
nvm use lts/carbon
node app.js &
Необходимо бросить object
в списке к a BinaryOp
, или, лучше, используйте параметр более определенного типа для списка:
delegate int BinaryOp(int x, int y);
List<BinaryOp> methodsToExecute = new List<BinaryOp>();
methodsToExecute.add(Add);
methodsToExecute.add(Subtract);
foreach(BinaryOp method in methodsToExecute)
{
method(1,2);
}
Используя.NET 3.0 (или 3.5?) у Вас есть универсальные делегаты.
Попробуйте это:
List<Func<int, int, int>> methodsToExecute = new List<Func<int, int, int>>();
methodsToExecute.Add(Subtract);
methodsToExecute.Add[0](1,2); // equivalent to Subtract(1,2)
List<Func<int, int, int>> n = new List<Func<int, int, int>>();
n.Add((x, y) => x + y);
n.Add((x, y) => x - y);
n.ForEach(f => f.Invoke(1, 2));
Не попробовали его, но использование Списка <Действие <t>>, тип должен смочь сделать это.
Мне нравится реализация Khoth лучше, но я думаю, что вызывает Вашу ошибку компилятора, то, что Вы не бросаете метод в BinaryOp, прежде чем Вы попытаетесь вызвать его. В Вашем цикле foreach это - просто "объект". Измените свой foreach для сходства с Khoth, и я думаю, что он работал бы.
Каждый раз, когда я испытал желание сделать что-то вроде этого, я нашел, что обычно лучше осуществить рефакторинг Ваш дизайн для использования шаблона "команда", тем более, что все методы имеют те же параметры. Этот путь допускает намного больше гибкости.
Имейте их всех реализация единого интерфейса, скажите IExecuteable и затем имейте Список <IExecutable>
Кроме того, использование делегатов:
class Example
{
public delegate int AddDelegate(int x, int y);
public List<AddDelegate> methods = new List<AddDelegate>();
int Execute()
{
int sum = 0;
foreach(AddDelegate method in methods)
{
sum+=method.Invoke(1, 2);
}
return sum;
}
}