C#MongoDb依赖注入&控制反转

时间:2016-03-01 18:49:19

标签: c# mongodb dependency-injection inversion-of-control ioc-container

我正在使用Mongo数据库来创建我想要创建的自定义CMS。我对MVC比较陌生,虽然不熟悉OOP语言,但我确实抓住了 - 我必须承认 - 依赖注入的概念,以及控制的反转如何更好地超越前者(在大多数情况下)。

我试过在互联网上寻找几天可以帮助我创建自己的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容器。

提前谢谢。

2 个答案:

答案 0 :(得分:0)

以下是使用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 Container自动装配。

答案 1 :(得分:0)

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