it-swarm.dev

İstisna: InvalidOperationException - Geçerli tür, bir arabirimdir ve yapılamaz. Bir eşleme türü eksik mi?

Bootstrapper'ımda:

namespace Conduit.Mam.ClientServices.Common.Initizliaer
{
    public static class Initializer
    {
        private static bool isInitialize;
        private static readonly object LockObj = new object();
        private static IUnityContainer defaultContainer = new UnityContainer();

        static Initializer()
        {
            Initialize();
        }

        public static void Initialize()
        {
            if (isInitialize)
                return;

            lock (LockObj)
            {
                IUnityContainer container = defaultContainer;

                //registering Unity for MVC
                DependencyResolver.SetResolver(new UnityDependencyResolver(container));

                //registering Unity for web API
                //  GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);

                #region managers
                container.RegisterType<ISettingsManager, SettingsManager>();

                container.RegisterType<IMamDataManager, MamDataManager>();

                container.RegisterType<IAppsDataManager, AppsDataManager>();
                #endregion

                if (!isInitialize)
                {
                    isInitialize = true;
                }
            }
        }
    }
}

kontrol cihazımın kodunda:

ISettingsManager sm = mUnityContainer.Resolve<ISettingsManager>();

mUnityContainer'da geziniyorum Görüyorum ki ISettingsManager, SettingsManager ile eşlenmiştir

ama sonra hatayı alıyorum:

İstisna: InvalidOperationException - Geçerli tür, bir arayüz ve inşa edilemez. Bir eşleme türü eksik mi?

Ben de denedim

ISettingsManager sm = (ISettingsManager)mUnityContainer.Resolve<>(typeof(ISettingsManager));

ama yararsız 

29
Elad Benda

Yanlış bağımlılık enjeksiyonunu kullanıyorsunuz. Doğru yol, kontrolörlerinizin ihtiyaç duydukları bağımlılıkları almalarını ve bağımlılık enjeksiyon çerçevesine bırakmalarını somut örneklere enjekte etmektir:

public class HomeController: Controller
{
    private readonly ISettingsManager settingsManager;
    public HomeController(ISettingsManager settingsManager)
    {
        this.settingsManager = settingsManager;
    }

    public ActionResult Index()
    {
        // you could use the this.settingsManager here
    }
}

Bu örnekte görebileceğiniz gibi, kontrol birimi konteyner hakkında hiçbir şey bilmiyor. Ve bu olması gerektiği gibi.

Tüm DI kabloları Bootstraper'ınızda olmalıdır. Kodunuzda asla container.Resolve<> çağrıları kullanmamalısınız.

Hatanızla ilgili olarak, muhtemelen denetleyicinizin içinde kullandığınız mUnityContainer, Bootstraper'ınızda yapılanla aynı değildir. Ancak denetleyicilerinizde herhangi bir konteyner kodu kullanmamanız gerektiğinden, bu artık bir sorun olmamalıdır.

18
Darin Dimitrov

Sadece yukarıdaki hatayla karşılaşmış olabilecek başkaları için (benim gibi). Basit terimlerle çözüm.

Arabiriminizi ve sınıfınızı (bu etkileşimi uygulayan) kaydınızı kodunuzda kaydetmeyi kaçırmış olabilirsiniz.

örneğin, hata ise
" Geçerli tür, xyznamespace. Imyinterfacename, bir arabirimdir ve oluşturulamaz. Bir tür eşleştirmesi eksik mi? "

Sonra Imyinterfacename içinde nityConfig sınıfını uygulayan sınıfı kaydetmelisiniz - Kayıt ol yöntem. aşağıdaki gibi bir kod kullanarak

 container.RegisterType<Imyinterfacename, myinterfaceimplclassname>();
31
Ram

Benim durumumda, söz konusu arayüz için mevcut bir örneği kaydetmemize rağmen bu hatayı alıyordum.

Bunun nedeni, Unity.WebForms Nuget paketi aracılığıyla WebForms'taki Unity'yi kullanmamdı ve bağımlılık için Hiyerarşik Ömür Boyu bir yönetici belirlememiştim, ancak bunun için bir geçici ömür boyu yöneticisi önceki türe bağlı olan sonraki bir tür - genellikle bir sorun değil - ancak Unity.WebForms ile ömür boyu yöneticileri biraz farklı çalışırlar ... enjekte edilen türleriniz Hiyerarşik bir ömür boyu yöneticiye ihtiyaç duyuyor gibi görünmekle birlikte Her web isteği (sanırım web formlarının mimarisi nedeniyle), bu post de mükemmel şekilde açıklandığı gibi.

Her neyse, bunları kaydederken türleri/örnekleri için ömür boyu bir yönetici belirtmeyerek çözdüm.

diğer bir deyişle.

container.RegisterInstance<IMapper>(MappingConfig.GetMapper(), new HierarchicalLifetimeManager());    
container.RegisterType<IUserContext, UserContext>(new TransientLifetimeManager());

olur

container.RegisterInstance<IMapper>(MappingConfig.GetMapper());
container.RegisterType<IUserContext, UserContext>();

Böylece IMapper burada başarıyla çözülebilir:

public class UserContext : BaseContext, IUserContext
{
    public UserContext(IMapper _mapper) : base(_mapper)
    {

    }
    ...
}
7
Breeno

Aşağıdaki kod sizin için yardımcı olacaktır 

public static IUnityContainer Initialise(IUnityContainer container = null)
    {
        if (container == null)
        {
            container = new UnityContainer();
        }

container.RegisterType<ISettingsManager, SettingsManager>(); container.Resolve<SettingsManager>(); container.RegisterType<SettingsManagerController>(new InjectionProperty("_SettingManagerProvider", new ResolvedParameter<ISettingManager>())); return container; }

0
Balamurugan

Bu sorunu yaşadım ve bunun nedeni Microsoft.Owin.Host.SystemWeb NuGet paketini projeme eklemememdi. Başlangıç ​​sınıfımdaki kod doğru olmasına rağmen yürütülmüyordu. 

Dolayısıyla, bu sorunu çözmeye çalışıyorsanız, Birlik kayıtlarını yaptığınız koda bir kesme noktası koyun. Vurmazsan, bağımlılık enjeksiyonun işe yaramaz. 

0
Dominic Cronin

Benim durumumda Unitofwork ve Ioc container ile 2 farklı içerik kullandım, bu yüzden servis katmanı DI'ye ikinci depo enjekte etmeye çalışırken bu problemin ısrarcı olduğunu görüyorum. Bunun nedeni, var olan modülün başka modül örneği ve kontrakte edilmemiş yeni depodan bir çağrı alması beklenen bir konteynır içermesidir. 

0
dewelloper

Kontrolörleri kaydettirmiyor olabilirsiniz .Aşağıdaki kodu deneyin:

Adım 1 . Kendi denetleyici fabrika sınıfınızı yazınız

  public class ControllerFactory :DefaultControllerFactory
    {
    protected override IController GetControllerInstance(RequestContext         requestContext, Type controllerType)
        {
            try
            {
                if (controllerType == null)
                    throw new ArgumentNullException("controllerType");

                if (!typeof(IController).IsAssignableFrom(controllerType))
                    throw new ArgumentException(string.Format(
                        "Type requested is not a controller: {0}",
                        controllerType.Name),
                        "controllerType");

                return MvcUnityContainer.Container.Resolve(controllerType) as IController;
            }
            catch
            {
                return null;
            }

        }
        public static class MvcUnityContainer
        {
            public static UnityContainer Container { get; set; }
        }
    }

Adım 2: BootStrap'a kaydedin: İnBuildUnityContainer yöntemi

private static IUnityContainer BuildUnityContainer()
    {
      var container = new UnityContainer();

      // register all your components with the container here
      // it is NOT necessary to register your controllers

      // e.g. container.RegisterType<ITestService, TestService>();    
      //RegisterTypes(container);
      container = new UnityContainer();
      container.RegisterType<IProductRepository, ProductRepository>();


      MvcUnityContainer.Container = container;
      return container;
    }

Adım 3: Global Asax'ta.

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
            Bootstrapper.Initialise();
            ControllerBuilder.Current.SetControllerFactory(typeof(ControllerFactory));

        }

Ve bitti

0
user5888468