如何只为不同版本的.NET提供一个项目?

时间:2012-11-10 08:46:29

标签: c# entity-framework

好吧,我有一个项目,目前我正在使用.NET 4.0,因为我希望这个应用程序与Windows XP兼容,因为EF 5.0仅适用于Windows 7及更高版本。

但是,我想用.NET 4.5的功能实现应用程序的某些部分,例如EF 5.0。

因此,对于我的数据库访问,我有一个reposotry类,现在使用EF 4.0,这是一个独立的dll,所以我可以创建使用EF 5的其他存储库dll,并在我的项目导入两个dll,然后我可以实例化根据我可以使用的EF 5.0版本更正存储库。这是配置文件中的参数。这是最好的方式吗?

我问这个是因为我不知道我必须在哪里声明我的界面。因为我的存储库类需要实现这个接口,但是这会把我的dll绑定到我的应用程序,但是我需要在两个不同的应用程序中使用这个存储库,所以我想实现一次,并在许多应用程序中使用。我想要独立的dll,因为现在是两个应用程序,但将来可以更多。

想要在使用存储库的应用程序中使用接口的原因是因为我想根据配置文件设置在运行时实例化正确的存储库。因此,在未来我可以实现新的存储库,并且不需要更改代码。

EDIT1:我读到了多目标,但是如果在我的项目中我使用.NET 4.0的功能而我想要编译3.5,我会收到错误,因为3.5中不存在此功能。那是对的。那么唯一的方法是保留两个不同的项目?这将是一项双重工作。

感谢。 Daimroc。

1 个答案:

答案 0 :(得分:1)

  

因此,对于我的数据库访问,我有一个现在使用EF的reposotry类   4.0,这是一个独立的dll,所以我可以创建其他使用EF 5的存储库dll,并在我的项目中导入两个dll,然后我可以   根据EF 5.0的版本实例化正确的存储库   我可以用。这是配置文件中的参数。是这个   最好的方式?

你可以走这条路,我真的没有看到它的问题,除非你认为这可能会导致未来的维护/开发问题。您还可以考虑其他一些事情。我认为两者都是完全有效的,可能只是个人意见/偏好。

  1. 模块您可以使用模块化路径,您的存储库DLL可能会动态加载。看看Microsoft's Unity library。这应该允许您在每个存储库DLL中创建一个IModule,它将根据需要设置您的应用程序。然后创建一个UnityBootstrapper类来告诉它如何找到你的模块(手动添加它们,查看目录等)。这应该允许您热插拔存储库DLL,而不必担心如果您不想设置配置文件。
  2. 预处理程序指令使用预处理程序指令,您可以定义代码的编译方式。根据你的课程结构的不同,这可能是设置相当简单的事情,也可能是一个让你想要抽象和重构你的课程的完整噩梦。这个问题:Detect target framework version at compile time有一个答案,可以根据目标框架处理不同的编译结果。就个人而言,我喜欢模块化路线。
  3.   

    我问这个是因为我不知道我必须在哪里声明我的界面。   因为我的存储库类需要实现这个接口,但是   然后把我的dll绑在我的应用程序上,但我需要使用它   两个不同的应用程序中的存储库,所以我想实现   曾经,并在许多应用程序中使用。我想要独立的dll,因为   现在是两个应用程序,但在将来,可以更多。

         

    想要在使用的应用程序中使用接口的原因   存储库是因为我想在运行时实例化   正确的存储库,根据配置文件设置。所以在   fututre我可以实现新的存储库,没有必要   改变代码。

    听起来您需要创建另一个用于在UI和Repository库之间进行通信的库。设置恰到好处可能有点棘手和压倒性。基本上,您希望网关DLL容纳接口和业务对象。您的应用程序将引用此DLL,此DLL将引用您的存储库。

    根据您的需要,您实际上可能需要设置另一个中间DLL,它实际上只容纳您的接口和大多数基本实用程序类。这将允许您使EF对象实现与应用程序使用的相同的接口,而不需要您的网关DLL必须来回映射业务对象和EF对象。

      

    EDIT1:我读到了多目标定位,但如果在我的项目中,我会使用   例如.NET 4.0的功能,我想要编译3.5,我得到   错误,因为3.5中不存在此功能。那是对的。   那么唯一的方法是保留两个不同的项目?这将是一个   双重工作。

    我相信你可以通过使用我上面提到的预处理器指令来解决这个问题。下面是一个使方法句柄工作方式不同的示例,具体取决于框架是否为.NET 2.0;这只是一个例子,没有经过测试。需要设置DefineConstants,但这应该允许您为多个框架目标处理1个项目,同时还能够在发布时使用更新的.NET功能。

    public Person FindPersonByName(List<Person> people, string name)
    {
    #if DOTNET_20
        foreach(Person person in people)
        {
            if (person.Name == name)
                return person;
        }
        return null;
    #else
        return people.FirstOrDefault(p => p.Name == name);
    #endif
    }
    

    我希望这对找到合适的解决方案很有帮助,也是最好的运气。