এন্টারপ্রাইজ লাইব্রেরি ইউনিটি বনাম অন্যান্য আইওসি কনটেইনারগুলি [বন্ধ]


135

এন্টারপ্রাইজ লাইব্রেরি ইউনিটি বনাম অন্যান্য আইওসি পাত্রে (উইন্ডসর, স্প্রিং. নেট, অটোফ্যাক ..) ব্যবহার করার পক্ষে কি কি বিধি আছে?


9
এই ধরণের প্রশ্ন সর্বদা বন্ধ থাকে। মতামত গুরুত্বপূর্ণ। তাদের রাখার মতো কোনও জায়গা আছে?
জেসন মারতাজায়া

1
@ জেসনমারতাজায়া, আমি ঠিক একই মন্তব্যটির প্রশংসা করতে চেয়েছিলাম, প্রশ্নটি বন্ধ হয়ে যাচ্ছে যে বিরক্ত করছে, কিন্তু বিকল্পটির কোনও উত্তর নেই।
মোহাম্মদ নুরাল্ডিন

উত্তর:


234

আমি একটি ব্যবহারকারী গোষ্ঠীর জন্য একটি উপস্থাপনা প্রস্তুত করছি। যেমন আমি তাদের একটি গুচ্ছ পেরিয়েছি। যথা: অটোফ্যাক, এমইএফ, নিনজেক্ট, স্প্রিং.নেট, স্ট্রাকচারম্যাপ, ইউনিটি এবং উইন্ডসর।

আমি 90% কেসটি দেখাতে চেয়েছিলাম (কনস্ট্রাক্টর ইনজেকশন, যা মূলত লোকেরা যাইহোক আইওসি ব্যবহার করে)। আপনি সমাধানটি এখানে পরীক্ষা করে দেখতে পারেন (VS2008)

এর মতো কয়েকটি মূল পার্থক্য রয়েছে:

  • আরম্ভ
  • অবজেক্ট পুনরুদ্ধার

তাদের প্রত্যেকের পাশাপাশি অন্যান্য বৈশিষ্ট্যও রয়েছে (কারও কারও এওপি, এবং আরও ভাল গিজমোস রয়েছে, তবে সাধারণত আমি আইওসি যা করতে চাই তা আমার জন্য বস্তু তৈরি এবং পুনরুদ্ধার করা)

দ্রষ্টব্য: বিভিন্ন লাইব্রেরি অবজেক্ট পুনরুদ্ধারের মধ্যে পার্থক্যগুলি কমন সার্ভিসলোকেটর ব্যবহার করে উপেক্ষা করা যেতে পারে: http://www.codeplex.com/CommonServiceLocator

এটি আমাদের সূচনা দিয়ে ছেড়ে দেয়, যা দুটি উপায়ে করা হয়: কোডের মাধ্যমে বা এক্সএমএল কনফিগারেশন (app.config / web.config / custom.config) এর মাধ্যমে। কেউ কেউ উভয়কে সমর্থন করেন, কেউ কেউ একটিকে সমর্থন করেন। আমার নোট করা উচিত: IoC বরাবর সাহায্য করতে কিছু ব্যবহার বৈশিষ্ট্য।

সুতরাং এখানে পার্থক্য সম্পর্কে আমার মূল্যায়ন:

Ninject

কোড সূচনা শুধুমাত্র (গুণাবলী সহ) আমি আশা করি আপনি ল্যাম্বডাস পছন্দ করবেন। প্রারম্ভিকেশন কোডটি এর মতো দেখাচ্ছে:

 IKernel kernel = new StandardKernel(
                new InlineModule(
                    x => x.Bind<ICustomerRepository>().To<CustomerRepository>(),
                    x => x.Bind<ICustomerService>().To<CustomerService>(),
                    x => x.Bind<Form1>().ToSelf()
                    ));

StructureMap

আরম্ভের কোড বা এক্সএমএল বা বৈশিষ্ট্য। v2.5 এছাড়াও খুব lambda'y। সব মিলিয়ে এটি আমার পছন্দের একটি। স্ট্রাকচারম্যাপ অ্যাট্রিবিউটগুলি কীভাবে ব্যবহার করে তার চারপাশে কয়েকটি খুব আকর্ষণীয় ধারণা।

ObjectFactory.Initialize(x =>
{
    x.UseDefaultStructureMapConfigFile = false;
    x.ForRequestedType<ICustomerRepository>()
        .TheDefaultIsConcreteType<CustomerRepository>()
        .CacheBy(InstanceScope.Singleton);

    x.ForRequestedType<ICustomerService>()
        .TheDefaultIsConcreteType<CustomerService>()
        .CacheBy(InstanceScope.Singleton);

    x.ForConcreteType<Form1>();
 });

ঐক্য

আরম্ভের কোড এবং এক্সএমএল। দুর্দান্ত লাইব্রেরি, তবে এক্সএমএল কনফিগারেশন হ'ল বাটের ব্যথা। মাইক্রোসফ্ট বা হাইওয়ে শপের জন্য দুর্দান্ত গ্রন্থাগার। কোড সূচনা সহজ:

 container.RegisterType<ICustomerRepository, CustomerRepository>()
          .RegisterType<ICustomerService, CustomerService>();

Spring.NET

এক্সএমএল যতটা কাছাকাছি আমি বলতে পারি। তবে কার্যকারিতার জন্য স্প্রিং.নেট সূর্যের নীচে এমন সবকিছু করে যা কোনও আইওসি করতে পারে। তবে একক করার একমাত্র উপায় এক্সএমএল এর মাধ্যমে এটি সাধারণত নেট নেটওয়ালা দ্বারা এড়ানো হয়। যদিও, অনেক। নেট / জাভা স্প্রিং.নেট এবং জাভা স্প্রিং প্রকল্পের। নেট সংস্করণের মধ্যে মিলের কারণে স্প্রিং.নেট ব্যবহার করে।

দ্রষ্টব্য : কোডের কনফিগারেশনটি এখন স্প্রিং.নেট কোডকনফিগের প্রবর্তনের মাধ্যমে সম্ভব ।

উইন্ডসর

এক্সএমএল এবং কোড। স্প্রিং.নেটের মতো, উইন্ডসর আপনি যা কিছু করতে চান তা করতে পারে। উইন্ডসর সম্ভবত আশেপাশের অন্যতম জনপ্রিয় আইওসি পাত্রে।

IWindsorContainer container = new WindsorContainer();
container.AddComponentWithLifestyle<ICustomerRepository, CustomerRepository>("CustomerRepository", LifestyleType.Singleton);
container.AddComponentWithLifestyle<ICustomerService, CustomerService>("CustomerService",LifestyleType.Singleton);
container.AddComponent<Form1>("Form1");

Autofac

এক্সএমএল এবং কোড উভয়ই মিশ্রিত করতে পারে (v1.2 সহ)। দুর্দান্ত সরল আইওসি লাইব্রেরি। বেসিকগুলি খুব বেশি হট্টগোল না করে করতে পারে বলে মনে হচ্ছে। উপাদানগুলির স্থানীয় স্কোপিং এবং একটি ভাল-সংজ্ঞায়িত লাইফ টাইম ম্যানেজমেন্ট সহ নেস্টেড পাত্রে সমর্থন করে।

আপনি এখানে এটি কীভাবে সূচনা করবেন:

var builder = new ContainerBuilder();
builder.Register<CustomerRepository>()
        .As<ICustomerRepository>()
        .ContainerScoped();
builder.Register<CustomerService>()
        .As<ICustomerService>()
        .ContainerScoped();
builder.Register<Form1>();

যদি আজ আমাকে চয়ন করতে হয়: আমি সম্ভবত স্ট্রাকচারম্যাপের সাথে যেতে চাই। এটি সি # 3.0 ভাষার বৈশিষ্ট্যগুলির জন্য সেরা সমর্থন এবং আদিতে সবচেয়ে নমনীয়তা রাখে।

দ্রষ্টব্য : ক্রিস ব্র্যান্ডসমা তার আসল উত্তরটি একটি ব্লগ পোস্টে পরিণত করেছে


1
কেবলমাত্র এক্সএমএল কনফিগারেশন, এটি কনফিগার করা আরও শক্ত করে তোলে। মূলত, আমি দেখি যে কেবলমাত্র লোকেরা যে স্প্রিং.নেট ব্যবহার করতে চায় তারা হলেন প্রাক্তন জাভা বিকাশকারী।
ক্রিস ব্র্যান্ডসমা

ক্রিস, আপনার সিদ্ধান্তগুলি সম্পর্কে: আপনি দয়া করে ক এর উপর আরও কিছু বিস্তারিত জানাতে পারেন) কোন সি # 3 বৈশিষ্ট্য যা আপনি উল্লেখ করছেন এবং খ) কী ধরণের সূচনা আপনার জন্য গুরুত্বপূর্ণ? ধন্যবাদ!
নিকোলাস ব্লুমহার্ট

2
হাই নিকোলাস: সি # 3 সমর্থন হিসাবে, অটোফ্যাক ইতিমধ্যে সমস্ত কিছু করে। :) আরম্ভের জন্য, আমি সিঙ্গলেটন / নন সিঙ্গলটনের জন্য সহজ সমর্থন এবং প্রতি সেশনের সূচনা চাই। শেষ অবধি, আমি কাস্টম নাম দ্বারা রেফারেন্স সহজ উপায় চাই। (স্ট্রাকচারম্যাপে পিটা যা এমন কিছু)। আমি চূড়ান্ত বৈশিষ্ট্য যা আমি এটির চেয়ে বেশি পছন্দ করি যখন আমি এটি মূলত লিখেছিলাম: অটোমকিং। আমি এটি সব সময় ব্যবহার করি না, তবে জাগ্রত হওয়া খুব সুন্দর।
ক্রিস ব্র্যান্ডসমা

আপনি এমইএফ-কেও উল্লেখ করেছেন, আমি আমার আইআরপোসিটরি বাস্তবায়ন বস্তুগুলি সরবরাহ করতে এবং এটি ঠিকঠাক কাজ করে খুঁজে পেতে এমইএফ ব্যবহার করি। এমইএফ সম্পর্কে আপনার মতামত কী?
তেরজিটাইল

এখানে একটি দুর্দান্ত, 20 মিনিটের স্ক্রিনকাস্টটি বেশিরভাগ ityক্যের
প্যাট

7

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

এর একটি অসুবিধা হ'ল এটি বরং নতুন তাই এতে পুরানো প্লেয়াররা ইতিমধ্যে বাছাই করা বাগ থাকতে পারে।

এটি বলার পরে, আপনি এটি পরীক্ষা করে দেখতে চাইতে পারেন ।


4

পুরানো থ্রেড তবে যেহেতু আমি যখন unityক্য বনাম স্প্রিংটনে টাইপ করছিলাম তখন গুগল আমাকে প্রথম দেখিয়েছিল ...

আপনি যদি এক্সএমএল কনফিগারেশন পছন্দ না করেন তবে স্প্রিং এখন কোডকনফিগ করে

http://www.springframework.net/codeconfig/doc-latest/reference/html/

এছাড়াও, স্প্রিং কেবল একটি ডিআই কনটেইনারের চেয়ে অনেক বেশি, যদি আপনি ডক্সের 'মডিউল' বিভাগটি দেখেন, ডিআই কন্টেইনারটি এটি করে এমন বিশাল স্ট্যাকের ভিত্তি।


3

আমার ভুল হয়ে থাকলে আমাকে সংশোধন করুন তবে আমি মনে করি অটোফ্যাক নিজেই এই লিঙ্কটিতে তালিকাবদ্ধ হিসাবে এক্সএমএল কনফিগারেশন সমর্থন করে: অটোফ্যাক এক্সএমএল কনফিগারেশন


2

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

উইন্ডসর এটিও করতে পারে এবং এটি কনফিগার না কোডেও করতে পারে। (আমি ভুল হলে আমাকে সংশোধন করুন, আমি এখানে যা শুনেছি তার মধ্য দিয়ে যাচ্ছি)।

আমি জানতে চাই Unক্য এটি করতে পারে কিনা।


2

একটি বিষয় লক্ষণীয়: নিনজেক্ট হ'ল একমাত্র IoC ধারক যা প্রাসঙ্গিক নির্ভরতা ইনজেকশনগুলিকে সমর্থন করে (তাদের ওয়েব সাইট অনুযায়ী)। তবে, অন্য আইওসি পাত্রে আমার অভিজ্ঞতা নেই বলে, এটি ধারণ করে কিনা তা আমি বলতে পারি না।


এটি যদি সমস্ত "প্রাসঙ্গিক নির্ভরতা ইনজেকশন" হয় নিনজেক্টে তখন .. উহ, বিশেষ কিছু নয়। ইউনিটি, অটোফ্যাক, উইন্ডসর অন্ততপক্ষে সমর্থিত (বিভিন্ন উপায়ে)।
ব্যবহারকারী 2864740

1

আমার 2 সেন্ট যোগ করার জন্য, আমি স্ট্রাকচারম্যাপ এবং bothক্য উভয়ই চেষ্টা করেছি। আমি স্ট্রাকচারম্যাপটি দুর্বল / বিভ্রান্তিকরভাবে নথিভুক্ত হতে, কনফিগার করার জন্য বাটে একটি ব্যথা এবং ব্যবহারের জন্য ক্লানকি পেয়েছি। অনুরূপভাবে, রেজোলিউশনের সময়ে কনস্ট্রাক্টর আর্গুমেন্টকে ওভাররাইড করার মতো পরিস্থিতি সমর্থন করে বলে মনে হয় না, যা আমার জন্য একটি মূল ব্যবহারের পয়েন্ট ছিল। তাই আমি এটিকে ফেলে দিয়ে ityক্য নিয়ে চলেছি এবং প্রায় 20 মিনিটের মধ্যে যা চাইছিলাম তা করে দিয়েছি।


1

আমি ব্যক্তিগতভাবে ইউনিটি ব্যবহার করি তবে এটি কেবল মাইক্রোসফ্টের পক্ষ থেকে। আমি এক কারণে সিদ্ধান্তের জন্য আফসোস করছি: এর বিপরীতে সবচেয়ে বড় জিনিসটির একটি বড় "বাগ" রয়েছে যা এটি ক্রমাগত ব্যতিক্রম ছুঁড়ে ফেলার কারণ করে। ডিবাগ করার সময় আপনি ব্যতিক্রমগুলি উপেক্ষা করতে পারেন। তবে আপনি যদি এটির জুড়ে চলে যান তবে এটি আপনার অ্যাপ্লিকেশনটি খুব ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে কমে যাবে an উদাহরণস্বরূপ, আমি বর্তমানে আমার কোডের একটি স্থানে এই ব্যতিক্রমটিকে "ফিক্সিং" করছি যেখানে ইউনিটির ব্যতিক্রমগুলি পৃষ্ঠার রেন্ডার সময়টিতে অতিরিক্ত 4 সেকেন্ড যুক্ত করে। আরও বিশদ বিবরণ এবং কর্মপরীক্ষার জন্য, দেখুন:

Ityক্য কি সর্বদা সিঙ্ক্রোনাইজেশন লকএক্সসেপশন নিক্ষেপ করা যায় না?


সতর্ক করার জন্য ধন্যবাদ! আপনার উল্লেখ করা প্রশ্নের উত্তর অনুসারে , বাগটি এখন সমাধান করা হয়েছে now
স্যাম

কেন ityক্য ব্যতিক্রম ছুঁড়ে মারছে? সাধারণত একটি ব্যতিক্রম হ'ল 'সমালোচনা ত্রুটি' (যেমন সমাধান না করা নির্ভরশীলতা) এবং দমন করার মতো কিছু না ..
ব্যবহারকারীর 2864740

মাফ করবেন, এই "বাগ" সমাধান হয়েছে নাকি আপনি এড়িয়ে যাওয়ার উপায় খুঁজে পেয়েছেন? আমি এখন সি # তে কাঠামো বেছে নিচ্ছি এবং এখনই unity
জোগ ড্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.