我正在学习c#,并且尝试使用Console Application
和Three Tier Architecture
进行基本登录Factory Method Design Pattern
。我添加了所有层并实现了与登录应用程序关联的所有逻辑。
但是,当我尝试使用dotnet run
命令运行代码时,它要求输入,输入后给出错误
未处理的异常:System.IO.FileNotFoundException:无法加载 文件或程序集'DataAccessLogic,版本= 1.0.0.0,区域性=中性, PublicKeyToken = null”。该系统找不到指定的文件。 在BusinessLogic.User.getUserName() 在C:\ Users \ xxx \ Desktop \ FactoryPatternSample \ FactoryMethodSampleApplication \ FactoryMethod \ Program.cs:line 14中的FactoryMethod.Program.Main(String [] args)中
尽管文件存在于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";
}
}
在Program.cs
中ILogin loginType = Login.attemptLogin(email, password);
if(loginType.AttemptLogin())
{
Console.WriteLine("Name: "+ loginType.getUserName());
}
loginType.getUserName()中的给出了错误,如果我更改getUserName()
方法以仅返回类似“ hello”的字符串,则给出输出,但是当我尝试从对象{{1 }}给出错误。
完整密码Github
任何帮助将不胜感激。
谢谢。
答案 0 :(得分:1)
从您的FactoryMethod.csproj
文件中可以看到,您没有在DataAccessLogic
项目中引用FactoryMethod
。这就是为什么不会将DataAccessLogic.dll
复制到bin/Debug/netcoreapp2.0/
文件夹,而异常消息确实告诉您的原因。
您可以手动复制此文件,并检查您的应用程序现在是否正在运行,但这会更好地修复您的引用。
说明:
您将BusinessLogic
引用为外部文件依赖项(..\BusinessLogic\obj\Debug\netstandard2.0\BusinessLogic.dll
),而不是 project-to-project 。这样,.Net CLR对BusinessLogic
依赖项一无所知,而只是将该文件 copy-if-newer 复制到FactoryMethod
项目的输出目录中。
然后,CLR将在运行时看到Program.cs
文件的第14行需要一个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
项目中修复引用。
有一个不错的docs about references。看看。