Функция F # в модуле, показывающая «Метод не найден» при вызове из пространства имен - PullRequest
6 голосов
/ 30 октября 2011

У меня есть функция, определенная в модуле с именем DataAccess, как этот

module DataAccess
let getData() = 
    ["abc";"def"]

Затем я использую контроллер F # MVC для извлечения данных вот так

[<HandleError>]
type FitnessController() = 
    inherit Controller()

    member x.Index() =
        let data = DataAccess.getData() |> List.map(fun p -> p) |> List.toArray
        x.View(data) :> ActionResult

Iполучить intellisense и все хорошо, но когда веб-страница всплывает, он говорит, что метод не существует

Method not found: 'Microsoft.FSharp.Collections.FSharpList`1<Models.Entity> DataAccess.getData()'.

Когда я смотрю на сборку в dotPeek, он обнаруживается как статический метод, которыйвозвращает список FSharp.Я что-то упускаю здесь очевидное?

(Не обращая внимания на тот факт, что getData и функция map ничего не делают, я опускаю код для краткости, getData просто содержит типы записей, помеченные как сериализуемые, но я по-прежнему получаю сообщение об ошибке даже при использовании строк впример кода здесь) Я также должен сказать, что это MVC 3 со страницами Razor C #.

1 Ответ

7 голосов
/ 07 ноября 2011

У вас есть DataAccess и FitnessController, определенные в одной сборке или в разных сборках?

Если они определены в разных сборках, то эта ошибка почти наверняка вызвана сборкой, содержащей FitnessController, скомпилированной с одной версиейсборка, которая содержит DataAccess, но во время выполнения загружается другая версия.

Это может произойти по ряду причин, две из которых я могу придумать:

  • версия сборки, содержащей DataAccess, развернута в gac.Загрузчик сборок .NET всегда использует версию, развернутую в GAC, если она существует, и версия в GAC довольно легко не синхронизируется с последней версией разработки.
  • версия сборки, содержащей DataAccessне копируется в каталог bin проекта asp.net при компиляции вашего кода.

Это происходит в вашей среде разработки или на производстве?Если это в вашей среде разработки, отладка должна быть довольно простой, просто запустите проект в режиме отладки, затем используйте окно Debug> Windows> Modules, чтобы увидеть, откуда загружаются две сборки.Как только вы поймете, что должно быть довольно легко увидеть, откуда возникла проблема.

В качестве альтернативы может быть проще упростить DataAccess и FitnessController в одной сборке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...