Что не так с моим кодом?Отображение необработанного исключения: System.IO.FileNotFoundException - PullRequest
0 голосов
/ 24 сентября 2018

Я изучаю c # и пытаюсь выполнить базовую регистрацию Console Application, используя Three Tier Architecture с Factory Method Design Pattern.Я добавил все слои и реализовал всю логику, связанную с приложением входа в систему.Но когда я пытаюсь запустить код с помощью команды dotnet run, он запрашивает ввод, после ввода выдает ошибку

Необработанное исключение: System.IO.FileNotFoundException: Не удалось загрузить файл или сборку 'DataAccessLogic, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = ноль '.Система не может найти указанный файл.в BusinessLogic.User.getUserName () в FactoryMethod.Program.Main (String [] args) в C: \ Users \ xxx \ Desktop \ FactoryPatternSample \ FactoryMethodSampleApplication \ FactoryMethod \ Program.cs: строка 14

Хотя файл присутствует в BusinessLogic.User.getUserName ();

Код представлен здесь

ILogin.cs

public interface ILogin
    {
        bool AttemptLogin();
        string getUserName();

    }

User.cs

using System;
using DataAccessLogic;
namespace BusinessLogic
{
    class User:ILogin
    {
       private string m_username;
       private string m_password;
       public User(string username, string password)
       {
           this.m_username = username;
           this.m_password = password;
       }
       public bool AttemptLogin()
       {
           if(m_username.Equals("abc") && m_password.Equals("abc123"))
           {
               return true;
           }
           return false;
       }
       public string getUserName()
       {
           IGetDetails objectType = GetDetails.getDetails(m_username);
           Console.WriteLine(objectType.getStudentName());
           return objectType.getStudentName();
       }
    }
}

IGetDetails.cs

using System;

namespace DataAccessLogic
{
    public interface IGetDetails
    {
        string getStudentName();
        string getStudentId();
    }
}

GetDetails.cs

namespace DataAccessLogic
{
    public class GetDetails
    {
        public static IGetDetails getDetails(string username)
        {
            Console.WriteLine(username);
            IGetDetails objectType = null;
            objectType = new GetValue(username);
            return objectType;
        }
    }
}

GetValue.cs

namespace DataAccessLogic
{
    public class GetValue:IGetDetails
    {
        private string m_username = string.Empty;
        public GetValue(string username)
        {
            this.m_username = username;
        }
        public string getStudentName()
        {
            return m_username;
        }
        public string getStudentId()
        {
            return "2205";
        }
    }

В программе .cs

ILogin loginType = Login.attemptLogin(email, password);
        if(loginType.AttemptLogin())
        {
            Console.WriteLine("Name: "+ loginType.getUserName());
        }

в loginType.getUserName () выдает ошибку, если я изменяю метод getUserName(), чтобы он просто возвращал строку типа «привет», он выдает результат, но когда я пытаюсь вернуть строку из объекта IGetDetailsвыдача ошибки.

Полный код источника Github

Любая помощь будет оценена.

Заранее спасибо.

1 Ответ

0 голосов
/ 24 сентября 2018

Как я вижу из вашего FactoryMethod.csproj файла, вы не ссылаетесь на DataAccessLogic в FactoryMethod проекте.Вот почему DataAccessLogic.dll не скопировано в папку bin/Debug/netcoreapp2.0/, и сообщение об исключении буквально говорит вам об этом.

Вы можете скопировать этот файл руками и проверить, работает ли ваше приложение сейчас,но это будет лучше, чтобы исправить ваши ссылки.

Объяснение:

Вы ссылаетесь BusinessLogic как зависимость от внешнего файла (..\BusinessLogic\obj\Debug\netstandard2.0\BusinessLogic.dll), а не от проекта к проекту .Таким образом .Net CLR ничего не знает о BusinessLogic зависимостях и просто copy-if-newer этого файла в FactoryMethod выходной каталог проекта.

Затем во время выполненияCLR увидит, что в 14 строке Program.cs файла нужен класс GetDetails, который находится в сборке DataAccessLogic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.Он пытается загрузить эту сборку из рабочего каталога, но не нашел ее, поэтому выдает System.IO.FileNotFoundException.

Решение:

Всегда копируйте этот файл вручную ИЛИ исправьте ваши ссылки так, чтобы проект FactoryMethod ссылался на BusinessLogic проект (не файл).Это можно сделать на вкладке Projects в окне Reference Manager.

Теперь Visual Studio создаст устаревший BusinessLogic проект и copy-if-newer все его зависимости.

Также исправьте ссылку вBusinessLogic Проект аналогичным образом.Есть хорошие документы о ссылках .Посмотри.

...