繁体   English   中英

如何在 C# 中的 3 个项目之间共享接口

[英]How to share interface between 3 projects in C#

我试图了解模块之间的共享接口,但我遇到了以下问题:我有三个项目:

  • 控制台应用程序 - 是主要项目,它想要获取数据。
  • Core Library - 是一个库,它根据共享接口决定使用哪个数据服务。
  • 数据库 - 是提供必要数据的库

基本概念是,当我想在 MySQL 和 SQL 服务器等数据库之间进行更改时,我没有更改所有基本代码,而只需要更改一个模块,即数据库。 感谢核心库,其他项目不需要知道 w 数据库中发生了什么,因为核心库是一个管理应该使用哪个 class 的项目。

项目参考如下:

ConsoleApplication --> CoreLibrary <-- DataLibrary

所以我创建了以下项目来提出问题。

控制台应用程序

class Program
{
    static void Main(string[] args)
    {
        var core = new Core();
        var dataService = core.GetDataService();
    }
}

核心库

public class Core
{
    public IDataService GetDataService()
    {
        return ???
    } 
}

public interface IDataService
{
    public IUserData UserData { get; set; }
}

public interface IUserData
{
    public string Name { get; set; }
    public string LastName { get; set; }
}

资料库

public class Data : IDataService
{
    public IUserData UserData { get; set; }
}
public class UserData : IUserData
{
    public string Name { get; set; }
    public string LastName { get; set; }
}

在 Core Library 的GetDataService方法中,我无法返回 Data 的 object 实例,因为它没有被DataLibrary引用。 如果我反转它们之间的引用,我将无法从CoreLibrary实现接口。 在我想相互引用的情况下,我收到一个错误“无法添加对'DataLibrary'的引用。将此项目作为引用添加会导致循环依赖”

我犯了什么错误。 这是一个好方法,但我错过了什么? 或者也许整个事情都是错误的,我应该考虑其他解决方案?

控制台应用程序是您的应用程序的启动路径,并且始终需要对系统中所有其他库的依赖(除了模块真正后期绑定并作为插件加载的情况)。 因此,让控制台应用程序依赖于数据库是没有问题的。 这个问题go 的答案足够详细,我不再在这里重复。

依赖注入 (DI) 的一种常见做法是使应用程序的入口点成为创建所有应用程序组件(包含应用程序行为的类)的位置。 在 DI 术语中,这个地方被称为Composition Root

这意味着控制台应用程序本身是创建数据库的Data class 的最合理的位置。 例如,像这样:

class Program
{
    static void Main(string[] args)
    {
        var dataService = new DataLibrary.Data();

        var appService = new CoreLibrary.ApplicationService(dataService);

        appService.DoSomething();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM