নিশ্চিত করুন যে নিয়ামকটির প্যারামিটারলেস পাবলিক কনস্ট্রাক্টর ত্রুটি রয়েছে


105

আমি এই টিউটোরিয়ালটি অনুসরণ করেছি যা দুর্দান্ত কাজ করেছে, যতক্ষণ না আমি আমার DbContextঅতিরিক্ত কন্সট্রাক্টর হিসাবে পরিবর্তন করেছি । রেজোলিউশনে আমার এখন সমস্যা রয়েছে এবং এটি ঠিক করতে কী করা উচিত তা নিশ্চিত নই। প্যারামিটারলেস কনস্ট্রাক্টরটিকে ধরতে বাধ্য করার কোনও সহজ উপায় আছে বা আমি এটি ভুলভাবে কাছে যাচ্ছি?

DbContext দুটি কনস্ট্রাক্টর সহ:

public class DashboardDbContext : DbContext
{
    public DashboardDbContext() : base("DefaultConnection") { }

    public DashboardDbContext(DbConnection dbConnection, bool owns)
        : base(dbConnection, owns) { }
}

SiteController কন্সট্রাকটর:

private readonly IDashboardRepository _repo;

public SiteController(IDashboardRepository repo)
{
    _repo = repo;
}

সংগ্রহস্থলের প্রয়োগ:

DashboardDbContext _context;

public DashboardRepository(DashboardDbContext context)
{
    _context = context;
}

UnityResolver কোড:

public class UnityResolver : IDependencyResolver
{
    private readonly IUnityContainer _container;

    public UnityResolver(IUnityContainer container)
    {
        _container = container;
    }

    public object GetService(Type serviceType)
    {
        try
        {
            return _container.Resolve(serviceType);
        }
        catch (ResolutionFailedException)
        {
            return null;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return _container.ResolveAll(serviceType);
        }
        catch (ResolutionFailedException)
        {
            return new List<object>();
        }
    }

    public IDependencyScope BeginScope()
    {
        var child = _container.CreateChildContainer();
        return new UnityResolver(child);
    }

    public void Dispose()
    {
        _container.Dispose();
    }
}

WebApiConfig:

var container = new UnityContainer();
container.RegisterType<IDashboardRepository, DashboardRepository>(new HierarchicalLifetimeManager());
config.DependencyResolver = new UnityResolver(container);

ওয়েবএপি কল থেকে ত্রুটি:

System.InuthorOperationException: 'SiteController' টাইপের একটি নিয়ামক তৈরি করার চেষ্টা করার সময় একটি ত্রুটি ঘটেছে। নিশ্চিত হয়ে নিন যে নিয়ামকটির প্যারামিটারলেস পাবলিক কনস্ট্রাক্টর রয়েছে।

at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()

অভ্যন্তরীণ ধারণা: সিস্টেম.আরগুমেন্টএক্সেপশন: টাইপ করুন 'ড্যাশবোর্ড.ওয়েব.কন্ট্রোলারস.সাইটকন্ট্রোলার'-এ ডিফল্ট কনস্ট্রাক্টর নেই।

at System.Linq.Expressions.Expression.New(Type type) 
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)

টিউটোরিয়ালটি দুর্দান্ত ছিল এবং আমি দ্বিতীয় কনস্ট্রাক্টর যোগ না করা পর্যন্ত আমার পক্ষে ভাল কাজ করে চলেছে।


2
ত্রুটিটি আপনাকে SiteControllerজানিয়ে দিচ্ছে যে প্যারামার্টলস কনস্ট্রাক্টর অবশ্যই থাকতে হবে, না DashboardDbContext
নীল স্মিথ

হাই স্মিথ। নীল, তবে অতিরিক্ত কন্সট্রাক্টরকে dbcontext এ যুক্ত করা হলে এটি ত্রুটিটি কেবল ছুঁড়ে দেয়। যদি আমি এটি সরিয়ে ফেলি বা এটি মন্তব্য করি (দ্বিতীয় নির্মাতা) এটি দুর্দান্ত কাজ করে।
স্কারপাচি

আমি কি কনস্ট্রাক্টর দেখতে পাচ্ছি SiteController?
নীল স্মিথ

এবং আমি অনুমান করছি আপনি সংগ্রহস্থলটি ইনজেকশন দিচ্ছেন DbContext?
নীল স্মিথ

@scarpacci আপনি কি কেবলমাত্র পরিবর্তনটিই DbContext থেকে দ্বিতীয় নির্মাতা অপসারণ করছেন? যদি না আপনি কোনওভাবে দ্বিতীয় ডিবি কনটেক্সট কনস্ট্রাক্টর না করে নিজের কন্ট্রোলারের ইনস্ট্যান্টেশনকে বাইপাস না করেন তবে ত্রুটিটি ডিবি কনটেক্সট এর কনস্ট্রাক্টরের উপর নির্ভরশীল হওয়ার কোনও মানে হবে না।
আসাদ সাইদুদ্দিন

উত্তর:


130

যা হচ্ছে তা হ'ল আপনি এই সমস্যায় দংশিত । মূলত, যা ঘটেছিল তা হ'ল আপনি নিজের ধারকগুলিতে স্পষ্টভাবে আপনার নিয়ন্ত্রকদের নিবন্ধন করেন নি। Ityক্য আপনার জন্য নিবন্ধভুক্ত কংক্রিটের ধরণের সমাধান করার চেষ্টা করে, তবে এটি এটি সমাধান করতে পারে না (আপনার কনফিগারেশনের একটি ত্রুটির কারণে), এটি বাতিল হয়ে যায়। এটি নাল ফিরে আসতে বাধ্য হয়, কারণ ওয়েব এপিআই IDependencyResolverচুক্তির কারণে এটি করতে বাধ্য করে । যেহেতু ইউনিটি নাল ফেরায়, ওয়েব এপিআই নিজেই কন্ট্রোলার তৈরি করার চেষ্টা করবে, তবে এটির ডিফল্ট নির্মাতা না থাকায় এটি "নিশ্চিত হয়ে নিন যে নিয়ামকের একটি প্যারামিটারলেস পাবলিক কনস্ট্রাক্টর রয়েছে" ব্যাতিক্রম হবে। এই ব্যতিক্রম বার্তাটি বিভ্রান্তিকর এবং আসল কারণটি ব্যাখ্যা করে না।

আপনি যদি আপনার কন্ট্রোলারগুলিকে স্পষ্টভাবে নিবন্ধভুক্ত করেন তবে আপনি আরও পরিষ্কার ব্যতিক্রম বার্তাটি দেখতে পেয়েছেন এবং এজন্য আপনার সর্বদা সমস্ত মূল ধরণের স্পষ্ট করে নিবন্ধন করা উচিত।

তবে অবশ্যই, কনফিগারেশন ত্রুটিটি আপনার নিজের থেকে দ্বিতীয় কনস্ট্রাক্টর যুক্ত করার মাধ্যমে আসে DbContext। ইউনিটি সর্বদা সর্বাধিক যুক্তি দিয়ে নির্মাণকারীকে বাছাই করার চেষ্টা করে, তবে এই নির্দিষ্ট কনস্ট্রাক্টরকে কীভাবে সমাধান করবেন তার কোনও ধারণা নেই।

সুতরাং আসল কারণটি হ'ল আপনি এটি তৈরির জন্য ইউনিটির অটো-ওয়্যারিং ক্ষমতাগুলি ব্যবহার করার চেষ্টা করছেন DbContextDbContextএকটি বিশেষ ধরণের যা অটো-ওয়্যার্ড হওয়া উচিত নয়। এটি একটি কাঠামোর ধরণ এবং তাই আপনাকে কারখানার প্রতিনিধি ব্যবহার করে এটি নিবন্ধভুক্ত করা উচিত :

container.Register<DashboardDbContext>(
    new InjectionFactory(c => new DashboardDbContext())); 

দয়া করে নোট করুন আপনি যখন আপনার প্রকল্পটি পুনর্নির্মাণ করেন আপনি এই লগইন শংসাপত্রগুলি পুনরায় সেট করতে পারেন ... এই সমাধানটি প্রয়োগ করার চেষ্টা করার আগে দয়া করে: আপনার প্রকল্পটি পুনর্নির্মাণ করুন, নিজেকে লগ আউট করুন, কেবলমাত্র তখনই - আপনার পৃষ্ঠাটি রিফ্রেশ করুন এবং সমস্যাটি অব্যাহত থাকলে পর্যবেক্ষণ করুন
ymz

আপনাকে ধন্যবাদ - আমার ব্যাকএন্ড টিমের এই ডিংলবেরিগুলি unityক্য কনফিগারেশনের সাথে প্রচুর নিয়ম ভঙ্গ করে। প্রতিটি দল এইভাবে আইওসি পাত্রে ব্যবহার করে কিনা তা ভাবতে শুরু করে।
ডাগরুমস

@ ডাগরুম: অনেকগুলি বিকাশকারী এটি দ্বারা বিট, তবে এটি এমন কোনও সমস্যা নয় যা সমস্ত ডিআই কনটেইনারগুলিতে বিদ্যমান। উদাহরণস্বরূপ সরল ইনজেক্টর, সর্বদা নিশ্চিত করবে যে এই জাতীয় ঘটনা ঘটলে কোনও অভিব্যক্তিগত ত্রুটি প্ররোচিত হয়। আর একটি ভাল পরামর্শ: একটি কাস্টম ব্যবহার করবেন না IDependencyResolverতবে IControllerActivatorপরিবর্তে কেবল একটি কাস্টম ব্যবহার করুন।
স্টিভেন

46

আমার ক্ষেত্রে এটি আমার ইনজেকশনের উপর নির্ভরশীলতা (আপনার উদাহরণে - ড্যাশবোর্ডরোপোসিটরি কনস্ট্রাক্টরের ভিতরে) এর কনস্ট্রাক্টরের অভ্যন্তরে ব্যতিক্রম ছিল। ব্যতিক্রম এমভিসি অবকাঠামোর ভিতরে কোথাও ধরা পড়েছিল। প্রাসঙ্গিক স্থানে লগ যুক্ত করার পরে আমি এটি পেয়েছি।


7
এটি একটি সত্যই গুরুত্বপূর্ণ উত্তর। এটি দেখার পরে ইউনিটির সাথে সেটআপ আপ বিষয়গুলির তাড়া করার ফাঁদে পড়ে খুব সহজ Make sure that the controller has a parameterless public constructor.তবে নির্ভরতা সেট আপ করা যথেষ্ট সম্ভব তবে তলদেশের গভীর একটি ব্যতিক্রম এটি সমাধান করা বন্ধ করে দিয়েছে।
ফিল কুপার

2
এই. এক মিলিয়ন বার! আমি আমার নিনেক্ট কনফিগারেশনে নির্ভরতার মানচিত্র যুক্ত করতে ভুলে গেছি।
ট্র্যাভো

অন্ত্রের ব্যতিক্রমগুলিতে আমার গভীরতা ছিল 'স্ট্রিং'-এর একটি ধরণের ধরণের সম্পত্তি যখন এটি' ডেটটাইম 'হওয়া উচিত ছিল? আমি যদি এই উত্তরটি না দেখতাম তবে তা সন্ধান করতে হবে না। অনেক অনেক ধন্যবাদ।
জাজি

LousyErrorMessageException () এর মতো আরও
সাইমন_উইভার

লগটি আপনি কি সম্পর্কিত স্থান স্থাপন করেছেন? আমি ডিবাগার থেকে দৌড়েছি কিন্তু কোনও ব্যতিক্রম পাইনি, এমনকি আমি যখন সমস্ত সিএলআর ব্যতিক্রমগুলি পরীক্ষা করেছিলাম তখনও। আমাকে ম্যানুয়াল কনস্ট্রাক্টর রেজোলিউশন যুক্ত করতে হয়েছিল এবং কেবল তখনই আমি ত্রুটি পেয়েছি। এটি আমাকে ব্যবহারযোগ্য ত্রুটি পেতে ডায়াগনস্টিক যুক্ত করতে বলেছিল, যা শেষ পর্যন্ত আমাকে কাজ করার জন্য কিছু দিয়েছে
আরজন

6

আমার একই সমস্যা ছিল এবং আমি ইউনিটিসিফিগ.সি.এস. ফাইলগুলিতে নির্ভরতা ইস্যুটি সমাধান করতে আপনাকে ইউনিটিসিফিগ.সি.সি ফাইলগুলিতে পরিবর্তন করে সমাধান করেছি:

public static void RegisterComponents()    
{
    var container = new UnityContainer();
    container.RegisterType<ITestService, TestService>();
    DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}

4

কখনও কখনও আপনি নিজের ইন্টারফেসটি কনটেইনার বুটস্ট্রায়ার.সিজে সমাধান করছেন বলে ত্রুটিটি ধরা খুব কঠিন। আমার ক্ষেত্রে আমি এপিআই কন্ট্রোলারের সাথে সংযুক্ত ইন্টারফেসটির বাস্তবায়ন সমাধানের ক্ষেত্রে একটি ত্রুটি হয়েছিল। আমি ত্রুটিটি খুঁজে পেলাম না কারণ আমি এইভাবে container.RegisterType<IInterfaceApi, MyInterfaceImplementaionHelper>(new ContainerControlledLifetimeManager());
আমার বুটস্ট্রাপ কনটেইনারটিতে ইন্টারফেসটি সমাধান করেছি : তারপরে আমি আমার বুটস্ট্র্যাপ ধারকটিতে নীচের লাইনটি যুক্ত করেছি : সুতরাং আমি container.RegisterType<MyController>();যখন প্রকল্পটি সংকলন করব তখন কম্পাইলার অভিযোগ করেছে এবং উপরের লাইনে থামিয়ে ত্রুটিটি দেখিয়েছে ।


4

আমারও একই সমস্যা ছিল। আমি দু'দিন ধরে এটি গুগল করেছিলাম। অবশেষে আমি দুর্ঘটনাক্রমে লক্ষ্য করেছি যে সমস্যাটি ছিল নিয়ামকের নির্মাণকারীর অ্যাক্সেস মডিফায়ার। আমি publicকন্ট্রোলারের নির্মাণকারীর পিছনে মূল শব্দটি রাখিনি put

public class MyController : ApiController
    {
        private readonly IMyClass _myClass;

        public MyController(IMyClass myClass)
        {
            _myClass = myClass;
        }
    }

আমি এই অভিজ্ঞতাটিকে অন্য উত্তর হিসাবে যুক্ত করছি অন্য কেউ অনুরূপ ভুল করেছে।


0

আপনার কন্ট্রোলারে যদি আপনার ইন্টারফেস থাকে

public myController(IXInterface Xinstance){}

আপনাকে অবশ্যই নির্ভরতা ইনজেকশন ধারকটিতে নিবন্ধভুক্ত করুন।

container.Bind<IXInterface>().To<XClass>().InRequestScope();

0

আমি এই ত্রুটিটি পেয়েছি যখন আমি দুর্ঘটনাক্রমে ইউনিটি কনটেনারটিতে সংজ্ঞা দেওয়া ইন্টারফেস টাইপের পরিবর্তে কোনও সম্পত্তিটিকে নির্দিষ্ট অবজেক্টের ধরণ হিসাবে সংজ্ঞায়িত করি।

উদাহরণ স্বরূপ:

ইউনিটি কনটেইনার সংজ্ঞায়িত:

var container = new UnityContainer();
container.RegisterInstance(typeof(IDashboardRepository), DashboardRepository);
config.DependencyResolver = new UnityResolver(container);

সাইটকন্ট্রোলার (ভুল উপায়ে - রেপো টাইপ বিজ্ঞপ্তি):

private readonly DashboardRepository _repo;

public SiteController(DashboardRepository repo)
{
    _repo = repo;
}

সাইট কন্ট্রোলার (সঠিক উপায়):

private readonly IDashboardRepository _repo;

public SiteController(IDashboardRepository repo)
{
    _repo = repo;
}

0

আপনি যদি নীচের মতো আপনার ধরণের ম্যাপিংগুলি রেজিস্টার করতে ইউনিটি কনফিগ.সি. ব্যবহার করেন using

public static void RegisterTypes(IUnityContainer container)
    {
     container.RegisterType<IProductRepository, ProductRepository>();
    }

আপনাকে **webApiConfig.cs**ধারক সম্পর্কে জানাতে হবে

config.DependencyResolver = new Unity.AspNet.WebApi.UnityDependencyResolver(UnityConfig.Container);

0

আমার ক্ষেত্রে, ityক্য একটি লাল রঙের হারিং হিসাবে দেখা গেছে। আমার সমস্যাটি নেট প্রকল্পের বিভিন্ন সংস্করণকে লক্ষ্য করে বিভিন্ন প্রকল্পের ফলাফল ছিল। Ityক্যটি সঠিকভাবে স্থাপন করা হয়েছিল এবং সবকিছু সঠিকভাবে ধারকটির সাথে নিবন্ধিত হয়েছিল। সবকিছু ঠিকঠাক সংকলিত। তবে ধরণটি শ্রেণীর পাঠাগারটিতে ছিল এবং শ্রেণি পাঠাগারটি .NET ফ্রেমওয়ার্ক ৪.০ লক্ষ্যবস্তুতে সেট করা হয়েছিল। ইউনিটি ব্যবহার করে ওয়েবএপিআই প্রকল্পটি .NET ফ্রেমওয়ার্ক 4.5 লক্ষ্য করার জন্য সেট করা হয়েছিল। ক্লাসের পাঠাগারটিও 4.5 লক্ষ্য হিসাবে পরিবর্তন করা আমার জন্য সমস্যাটি স্থির করে।

আমি ডিআই কনস্ট্রাক্টরকে মন্তব্য করে এবং ডিফল্ট কনস্ট্রাক্টর যুক্ত করে এটি আবিষ্কার করেছি। আমি কন্ট্রোলার পদ্ধতিগুলি সম্পর্কে মন্তব্য করেছি এবং তাদের নোট-ইমপ্লিমেন্টেড এক্সেপশন নিক্ষেপ করতে বাধ্য করেছি। আমি নিশ্চিত হয়েছি যে আমি নিয়ামকের কাছে পৌঁছে যেতে পারি, এবং আমার নোটআইপ্লিমেন্টেড এক্সেপশন দেখে আমাকে বলেছিল যে এটি নিয়ামককে জরিমানা করছে। এর পরে, ডিফল্ট নির্মাত্রে আমি Iক্যের উপর নির্ভর করার পরিবর্তে ম্যানুয়ালি নির্ভরশীলতা শৃঙ্খলা ইনস্ট্যান্ট করেছিলাম। এটি এখনও সংকলিত হয়েছে, তবে আমি এটি চালানোর সময় ত্রুটি বার্তাটি ফিরে এসেছিল। এটি আমার পক্ষে নিশ্চিত করেছে যে Unক্য ছবিটির বাইরে থাকা অবস্থায়ও আমি ত্রুটিটি পেয়েছি। অবশেষে, আমি শৃঙ্খলের নীচে থেকে শুরু করে আমার পথে কাজ করেছি, একবারে একটি লাইন মন্তব্য করেছি এবং ত্রুটি বার্তাটি না পাওয়া পর্যন্ত আমি অপেক্ষা করছি। এটি আমাকে আপত্তিকর শ্রেণীর দিকে নির্দেশ করেছিল এবং সেখান থেকে আমি বুঝতে পেরেছিলাম যে এটি একটি একক সমাবেশে বিচ্ছিন্ন ছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.