【问题标题】:C# MongoDb Dependency Injection & Inversion of ControlC# MongoDb 依赖注入和控制反转
【发布时间】: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


【解决方案1】:

这是一个使用 ServiceStack.Funq 的示例

你的 global.asax 应该是这样的

    protected void Application_Start()
    {
        Funq container = new Funq.Container();

        container.Register<IMyType>(c => new MyType());
        ControllerBuilder.Current.SetControllerFactory(new FunqControllerFactory(container));
    }

和你的控制器

public class ExampleController : ServiceStackController
{
   public IMyType MyType {get;set;}

   public ActionResult Index(){
      return View();
   }
}

MyType 将由 IoC 容器自动装配。

【讨论】:

  • 为此您需要 ServiceStack.Mvc 包。它依赖于包含 ServiceStack.Funq 的 ServiceStack 包。请注意,ServiceStack v3.9.71 是最后一个非商业版本。 ServiceStack v4 是商业的,但可以使用但有一些限制。
  • 感谢您的回复。我将不得不尝试一下,看看我是否可以更好地掌握 IoC 容器
【解决方案2】:

有很多成熟的 IoC 容器具有广泛的 MVC 支持,因此无需实现您自己的。您可以查看 performancefeature 基准,选择一些顶级狗并在文档中查找 MVC 集成。通常包括示例。

【讨论】:

    猜你喜欢
    • 2012-02-05
    • 1970-01-01
    • 2010-10-31
    • 2011-03-14
    • 2021-04-22
    • 1970-01-01
    • 2011-02-08
    • 2015-01-09
    相关资源
    最近更新 更多