Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多个长度为2的构造函数。无法用统一来消除歧义_C#_Mongodb_Dependency Injection_Unity Container - Fatal编程技术网

C# 多个长度为2的构造函数。无法用统一来消除歧义

C# 多个长度为2的构造函数。无法用统一来消除歧义,c#,mongodb,dependency-injection,unity-container,C#,Mongodb,Dependency Injection,Unity Container,我想将DI与MongoDB的存储库类和接口一起使用,但它不起作用。我有一个错误: MongoRepository`1类型具有多个长度为2的构造函数。无法消除歧义 类构造函数: public MongoRepository(string connectionString, string collectionName) { this.collection = Util<TKey>.GetCollectionFromConnectionString<T

我想将DI与MongoDB的存储库类和接口一起使用,但它不起作用。我有一个错误:

MongoRepository`1类型具有多个长度为2的构造函数。无法消除歧义

类构造函数:

    public MongoRepository(string connectionString, string collectionName)
    {
        this.collection = Util<TKey>.GetCollectionFromConnectionString<T>(connectionString, collectionName);
    }


    public MongoRepository(MongoUrl url, string collectionName)
    {
        this.collection = Util<TKey>.GetCollectionFromUrl<T>(url, collectionName);
    }
public MongoRepository(string connectionString,string collectionName)
{
this.collection=Util.GetCollectionFromConnectionString(connectionString,collectionName);
}
公共MongoRepository(MongoUrl、字符串集合名称)
{
this.collection=Util.GetCollectionFromUrl(url,collectionName);
}
统一配置:

container.RegisterType(typeof(MongoRepository.IRepository<>), typeof(MongoRepository.MongoRepository<>));
container.RegisterType(typeof(MongoRepository.IRepository)、typeof(MongoRepository.MongoRepository));

如何在Unity中配置DI?谢谢

解决方案很简单:在处理框架类型时不要使用自动布线,如中所述

而是为框架类型注册工厂委托。但是,这在您的情况下不起作用,因为您正在处理泛型类型,但解决方法很简单:创建派生类型并注册:

public class MyMongoRepository<T> : MongoRepository<T>
{
    // of course you should fill in the real connection string here.
    public MyMongoRepository() : base("connectionString", "name") { }
}

container.RegisterType(typeof(IRepository<>), typeof(MyMongoRepository<>));
公共类MyMongoRepository:MongoRepository
{
//当然,您应该在这里填写真正的连接字符串。
public MyMongoRepository():base(“connectionString”,“name”){}
}
容器注册类型(typeof(IRepository),typeof(MyMongoRepository));

注意,您还可以告诉Unity它应该使用哪个构造函数:

//Use the MongoRepository(string, string) constructor:
container.RegisterType(
    typeof(IRepository<>), 
    typeof(MyMongoRepository<>),
    new InjectionConstructor(typeof(string), typeof(string)));
//使用MongoRepository(string,string)构造函数:
container.RegisterType(
类型(IRepository),
类型(MyMongoRepository),
新的注入构造函数(typeof(string),typeof(string));

为什么它能解决我的问题?container.RegisterType(新注入构造函数())@chemitaxis:它解决了您的问题,因为现在您有了一个泛型类型以及Unity知道如何调用的构造函数。你试过了吗?老实说,人们会因此而炒我鱿鱼的,真正的解决办法是停止使用Unity,使用一个像样的IoC容器,比如Autofac,它可以处理你想扔给它的任何东西。事实上,团结在每一个障碍上都会失败。这个解决方案对我有效,比公认的答案更简单