【发布时间】:2016-03-01 18:49:18
【问题描述】:
我正在为我正在尝试创建的自定义 CMS 使用 Mongo 数据库。我对 MVC 比较陌生,虽然对 OOP 语言并不陌生,但我确实掌握了 - 我必须隐约承认 - 依赖注入的概念,以及控制反转如何更好地超越前者(在大多数情况下)。
我已经尝试在 Internet 上寻找几天的示例,这些示例可以帮助我创建自己的 DI 或 IoC 容器,但仍然无济于事。据我目前的理解,MVC(和一般的 C#)严重依赖约定,因此我的问题是。
到目前为止,使用 MongoDB 大学 MVC 项目的示例,我有这个模型设置可以帮助我连接我的 mongo 数据库:
public class BlogContext
{
private static readonly MongoCredential Credentials = MongoCredential.CreateCredential("admin", "root", "*****");
private static readonly MongoServerAddress MongoServerAddress = new MongoServerAddress("localhost", 27017);
private static readonly MongoClientSettings MongoClientSettings = new MongoClientSettings
{
Credentials = new[] { Credentials },
Server = MongoServerAddress
};
public const string DATABASE_NAME = "testdb";
public const string POSTS_COLLECTION_NAME = "cmstest";
public const string USERS_COLLECTION_NAME = "users";
// This is ok... Normally, they would be put into
// an IoC container.
private static readonly IMongoClient _client;
private static readonly IMongoDatabase _database;
static BlogContext()
{
_client = new MongoClient(MongoClientSettings);
_database = _client.GetDatabase(DATABASE_NAME);
}
public IMongoClient Client => _client;
public IMongoCollection<Article> Articles => _database.GetCollection<Article>(POSTS_COLLECTION_NAME);
public IMongoCollection<User> Users => _database.GetCollection<User>(USERS_COLLECTION_NAME);
}
并且对于每个控制器操作,或者每当我需要访问我的数据库时,我都会初始化一个 BlogContext 类并像这样连接
var blogContext = new BlogContext();
await blogContext.Articles.UpdateOneAsync(x => x.Id == id, update);
我确实知道(并且我已经读过很多次)Mongo 使用连接池并且它是线程安全的。我正在寻找一种更好的方法来实现它。无论是通过创建接口并使用依赖注入,还是通过使用 IoC 容器,正如类注释所暗示的那样。
我已经阅读了有关通过 Castle Windsor 或 Unity 实现 IoC 的信息,但我正在寻找的是一个示例。这样,也许我可以使用它来创建我自己的 IoC 容器。
提前谢谢你。
【问题讨论】:
-
依赖注入是一种控制反转的形式,它们不是相互竞争的概念——一个并不比另一个“更好”。 Mark Seemann 的书 Dependency Injection in .Net 是一个很好的学习资源,其中包含 DIY 依赖注入的示例和使用流行框架的示例。
-
谢谢,我得看看那本书才能更好地理解
标签: c# mongodb dependency-injection inversion-of-control ioc-container