编程语言
首页 > 编程语言> > 首页> C#> Unity:当前类型是一个接口,不能被构造

首页> C#> Unity:当前类型是一个接口,不能被构造

作者:互联网

下面的代码开始

public interface IDataContextAsync : IDataContext
{
    Task<int> SaveChangesAsync(CancellationToken cancellationToken);
    Task<int> SaveChangesAsync();
}

public partial class DB1Context : DataContext{ }

public partial class DB2Context : DataContext{ }

以下是UnityConfig文件.注意:我正在为ASP.Net MVC使用Nuget引导程序,以下是我的UnityConfig文件

        public static void RegisterTypes(IUnityContainer container)
    {           
        container
            .RegisterType<IDataContextAsync, DB1Context>("DB1Context", new PerRequestLifetimeManager())
            //.RegisterType<IDataContextAsync, DB2Context>("DB2Context", new PerRequestLifetimeManager())
            .RegisterType<IRepositoryProvider, RepositoryProvider>(
                new PerRequestLifetimeManager(),
                new InjectionConstructor(new object[] {new RepositoryFactories()})
            )
            .
            .
            .
            .
    }

而且我得到以下错误:

The current type, Repository.Pattern.DataContext.IDataContextAsync, is
an interface and cannot be constructed. Are you missing a type
mapping?

了解该命名实例不适用于我的UnityConfig.
有想法吗?

提前致谢

解决方法:

正在执行解析的服务定位器(在构造函数要求IDataContextAsync之后)可能正在尝试解决以下问题:

Current.Resolve<IDataContextAsync>()

当它需要这样解决时

Current.Resolve<IDataContextAsync>("DB1Context");

而且它不会内置任何额外的逻辑.

如果要有条件解决,可以使用注入工厂:

   public static class Factory
   {
        public static IDataContextAsync GetDataContext()
        {
            if (DateTime.Now.Hour > 10)
            {
                return new DB1Context();
            }
            else
            {
                return new DB2Context();
            }
        }
    }

..并像这样注册IDataContextAsync:

Current.RegisterType<IDataContextAsync>(new InjectionFactory(c => Factory.GetDataContext()));

因为它需要委托,所以您不一定需要静态的类/方法,而是可以内联地执行它.

标签:asp-net-web-api,unity-container,c,asp-net-mvc
来源: https://codeday.me/bug/20191027/1947236.html