Linq to sql UNITY:每次传递一个新的datacontext?

Linq to sql UNITY:每次传递一个新的datacontext?,linq-to-sql,dependency-injection,unity-container,ioc-container,datacontext,Linq To Sql,Dependency Injection,Unity Container,Ioc Container,Datacontext,我试图使用unity在每次使用新实例时自动在我的存储库中注入datacontext。我的想法是确保每次注入新datacontext 目前它无法创建存储库,我认为它无法解析MyDataContext container = new UnityContainer(); Container.RegisterType<MyDataContext, MyDataContext>() .RegisterType<IOfficeRep

我试图使用unity在每次使用新实例时自动在我的存储库中注入datacontext。我的想法是确保每次注入新datacontext

目前它无法创建存储库,我认为它无法解析MyDataContext

        container = new UnityContainer();

        Container.RegisterType<MyDataContext, MyDataContext>()
            .RegisterType<IOfficeRepository, OfficeRepository>()
            .RegisterType<IOfficeService, OfficeService>();
在“存储库”(见下文)上创建构造函数以接受存储库上的DataContext之前,一切都正常,但现在失败了

我目前在global.asax中创建的unity容器中有此设置,我还注册了MyDataContext类型,它是标准DataContext

        container = new UnityContainer();

        Container.RegisterType<MyDataContext, MyDataContext>()
            .RegisterType<IOfficeRepository, OfficeRepository>()
            .RegisterType<IOfficeService, OfficeService>();
这是我的存储库

public class OfficeRepository : IOfficeRepository
{
    private MyDataContext db;

    public OfficeRepository (MyDataContext dataContext)
    {
        this.db = dataContext;
    }
编辑

我差点忘了我这么做是为了创建服务

officeService = Bootstrapper.Container.Resolve<IOfficeService>();
编辑-删除存储库上的构造函数有效

这与datacontext有关,因为如果我删除存储库中接受datacontext的constructor,那么所有工作都会正常进行,但当然我需要它接受datacontext,以便每次都能注入“新”datacontext

public class OfficeRepository : IOfficeRepository
{
    private MyDataContext db new MyDataContext(); // CHANGE

    //public OfficeRepository (MyDataContext dataContext)
    //{
        //this.db = dataContext;
    //}
编辑-实际错误

   MyDataContext tes2t = new MyDataContext ();
在深入挖掘之后,我发现了这个错误

The type MyDataContext has multiple constructors of length 2. 
Unable to disambiguate. (Strategy type DynamicMethodConstructorStrategy, index 0)
(Strategy type BuildPlanStrategy, index 3)
编辑-测试以使用一行代码解析DATACONTEXT

这也会失败,错误与上面相同-多个构造函数

  MyDataContext test = Bootstrapper.Container.Resolve<MyDataContext >();
编辑-演示在没有Unity的代码中创建DataContext 100%有效,没有问题

   MyDataContext tes2t = new MyDataContext ();

我不确定这是否有效,但您是否尝试将MyDataContext注册为组件而不是类型映射

container.RegisterType<MyDataContext>();
container.RegisterType();
而不是

container.RegisterType<MyDataContext, MyDataContext>();
container.RegisterType();

根据新信息进行编辑

罪魁祸首似乎是MyDataContext有多个构造函数。这是大多数DI容器的常见问题,因为它们只需要选择并使用一个容器。如果您可以通过限制MyDataContext只有一个构造函数来消除歧义,那么这可能是最简单的解决方案

否则,您应该能够在注册存储库时使用InjectionConstructor实例来标识构造函数。假设要使用以连接字符串作为参数的构造函数:

string connectionString =
    ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString;
var injectedConnectionString = new InjectionConstructor(connectionString);
container.RegisterType<MyDataContext>(injectedConnectionString);
字符串连接字符串=
ConfigurationManager.ConnectionString[“MyConnection”]。ConnectionString;
var injectedConnectionString=新的InjectionConstructor(connectionString);
RegisterType(injectedConnectionString);

我没有看到您的MyDataContext构造函数;但是尝试将[InjectionConstructor]属性添加到您想要使用的构造函数中。

由于有多个构造函数可供选择,Unity不知道使用哪个构造函数。它将选择一个具有最多可满足的参数的构造函数,但在本例中,有两个构造函数,每个构造函数具有两个可解析的参数


如果您不想将
MyDataContext
类与Unity耦合,并使用Scott建议的
InjectionConstructor
属性(向上投票:),可以使用fluent接口指定注册时应使用的构造函数。有关详细信息,请参阅。

更新了问题,以显示我如何使用Unity解析我的服务。如果您尝试在不同点使用Unity解析MyDataContext实例,会发生什么情况?看起来一切正常,但这可能会给我们一个线索。另外,在第一段代码摘录中是否有漏行或打字错误?看起来
container
container
是不同的实例。您可以使用调试器检查您是否拥有所需的实例。我已使用错误消息“该类型有多个长度为2的构造函数。无法消除歧义。”更新了问题。好的,所以。。。
MyDataContext
是否有我们不知道的其他构造函数?谢谢Mark,我尝试过了,也是一样的。我已经用具体的错误更新了我的问题。更新的问题也显示删除构造函数是有效的,但当然我需要构造函数接受DataContext-有什么想法吗?谢谢mark!太好了,谢谢。。我现在就去试一试。。1秒!谢谢你!你把它分类了!!我每天都学到新东西!我走捷径,因为我对0参数感兴趣,所以我做了这个。。。它似乎可以工作RegisterType(newinjectionconstructor());关于删除构造函数,这实际上不是一个选项,因为它是由一个外部工具创建的,谁知道有一天我可能需要它们…-)。。。但是,传入InjectionConstructor非常有效,这应该是有效的,但会将MyDataContext与Unity紧密结合起来。这一事实确实有效!!!但正如Mark所指出的,它的紧密耦合以及我的datacontext是由外部util创建的,因此属性将被覆盖。。。我真的不完全理解unity为什么会有问题,我对任何构造函数(即具有2个APRAM的构造函数)都不感兴趣,我只对zero param构造函数感兴趣,当然只有1个。。。还有其他选择吗???
string connectionString =
    ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString;
var injectedConnectionString = new InjectionConstructor(connectionString);
container.RegisterType<MyDataContext>(injectedConnectionString);