এন্টারপ্রাইজ লাইব্রেরি ইউনিটি বনাম অন্যান্য আইওসি পাত্রে (উইন্ডসর, স্প্রিং. নেট, অটোফ্যাক ..) ব্যবহার করার পক্ষে কি কি বিধি আছে?
এন্টারপ্রাইজ লাইব্রেরি ইউনিটি বনাম অন্যান্য আইওসি পাত্রে (উইন্ডসর, স্প্রিং. নেট, অটোফ্যাক ..) ব্যবহার করার পক্ষে কি কি বিধি আছে?
উত্তর:
আমি একটি ব্যবহারকারী গোষ্ঠীর জন্য একটি উপস্থাপনা প্রস্তুত করছি। যেমন আমি তাদের একটি গুচ্ছ পেরিয়েছি। যথা: অটোফ্যাক, এমইএফ, নিনজেক্ট, স্প্রিং.নেট, স্ট্রাকচারম্যাপ, ইউনিটি এবং উইন্ডসর।
আমি 90% কেসটি দেখাতে চেয়েছিলাম (কনস্ট্রাক্টর ইনজেকশন, যা মূলত লোকেরা যাইহোক আইওসি ব্যবহার করে)। আপনি সমাধানটি এখানে পরীক্ষা করে দেখতে পারেন (VS2008)
এর মতো কয়েকটি মূল পার্থক্য রয়েছে:
তাদের প্রত্যেকের পাশাপাশি অন্যান্য বৈশিষ্ট্যও রয়েছে (কারও কারও এওপি, এবং আরও ভাল গিজমোস রয়েছে, তবে সাধারণত আমি আইওসি যা করতে চাই তা আমার জন্য বস্তু তৈরি এবং পুনরুদ্ধার করা)
দ্রষ্টব্য: বিভিন্ন লাইব্রেরি অবজেক্ট পুনরুদ্ধারের মধ্যে পার্থক্যগুলি কমন সার্ভিসলোকেটর ব্যবহার করে উপেক্ষা করা যেতে পারে: http://www.codeplex.com/CommonServiceLocator
এটি আমাদের সূচনা দিয়ে ছেড়ে দেয়, যা দুটি উপায়ে করা হয়: কোডের মাধ্যমে বা এক্সএমএল কনফিগারেশন (app.config / web.config / custom.config) এর মাধ্যমে। কেউ কেউ উভয়কে সমর্থন করেন, কেউ কেউ একটিকে সমর্থন করেন। আমার নোট করা উচিত: IoC বরাবর সাহায্য করতে কিছু ব্যবহার বৈশিষ্ট্য।
সুতরাং এখানে পার্থক্য সম্পর্কে আমার মূল্যায়ন:
কোড সূচনা শুধুমাত্র (গুণাবলী সহ) আমি আশা করি আপনি ল্যাম্বডাস পছন্দ করবেন। প্রারম্ভিকেশন কোডটি এর মতো দেখাচ্ছে:
IKernel kernel = new StandardKernel(
new InlineModule(
x => x.Bind<ICustomerRepository>().To<CustomerRepository>(),
x => x.Bind<ICustomerService>().To<CustomerService>(),
x => x.Bind<Form1>().ToSelf()
));
আরম্ভের কোড বা এক্সএমএল বা বৈশিষ্ট্য। 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>();
এক্সএমএল যতটা কাছাকাছি আমি বলতে পারি। তবে কার্যকারিতার জন্য স্প্রিং.নেট সূর্যের নীচে এমন সবকিছু করে যা কোনও আইওসি করতে পারে। তবে একক করার একমাত্র উপায় এক্সএমএল এর মাধ্যমে এটি সাধারণত নেট নেটওয়ালা দ্বারা এড়ানো হয়। যদিও, অনেক। নেট / জাভা স্প্রিং.নেট এবং জাভা স্প্রিং প্রকল্পের। নেট সংস্করণের মধ্যে মিলের কারণে স্প্রিং.নেট ব্যবহার করে।
দ্রষ্টব্য : কোডের কনফিগারেশনটি এখন স্প্রিং.নেট কোডকনফিগের প্রবর্তনের মাধ্যমে সম্ভব ।
এক্সএমএল এবং কোড। স্প্রিং.নেটের মতো, উইন্ডসর আপনি যা কিছু করতে চান তা করতে পারে। উইন্ডসর সম্ভবত আশেপাশের অন্যতম জনপ্রিয় আইওসি পাত্রে।
IWindsorContainer container = new WindsorContainer();
container.AddComponentWithLifestyle<ICustomerRepository, CustomerRepository>("CustomerRepository", LifestyleType.Singleton);
container.AddComponentWithLifestyle<ICustomerService, CustomerService>("CustomerService",LifestyleType.Singleton);
container.AddComponent<Form1>("Form1");
এক্সএমএল এবং কোড উভয়ই মিশ্রিত করতে পারে (v1.2 সহ)। দুর্দান্ত সরল আইওসি লাইব্রেরি। বেসিকগুলি খুব বেশি হট্টগোল না করে করতে পারে বলে মনে হচ্ছে। উপাদানগুলির স্থানীয় স্কোপিং এবং একটি ভাল-সংজ্ঞায়িত লাইফ টাইম ম্যানেজমেন্ট সহ নেস্টেড পাত্রে সমর্থন করে।
আপনি এখানে এটি কীভাবে সূচনা করবেন:
var builder = new ContainerBuilder();
builder.Register<CustomerRepository>()
.As<ICustomerRepository>()
.ContainerScoped();
builder.Register<CustomerService>()
.As<ICustomerService>()
.ContainerScoped();
builder.Register<Form1>();
যদি আজ আমাকে চয়ন করতে হয়: আমি সম্ভবত স্ট্রাকচারম্যাপের সাথে যেতে চাই। এটি সি # 3.0 ভাষার বৈশিষ্ট্যগুলির জন্য সেরা সমর্থন এবং আদিতে সবচেয়ে নমনীয়তা রাখে।
দ্রষ্টব্য : ক্রিস ব্র্যান্ডসমা তার আসল উত্তরটি একটি ব্লগ পোস্টে পরিণত করেছে ।
যতদূর আমি দেখেছি এগুলি এখানে এবং সেখানে কয়েকটি প্রয়োগের বিশদ বাদে তারা প্রায় একই রকম। ইউনিটির প্রতিযোগিতার উপরে সবচেয়ে বড় সুবিধাটি হ'ল এটি মাইক্রোসফ্ট সরবরাহ করে, সেখানে প্রচুর সংস্থাগুলি রয়েছে যা ওএসএসকে ভয় পায়।
এর একটি অসুবিধা হ'ল এটি বরং নতুন তাই এতে পুরানো প্লেয়াররা ইতিমধ্যে বাছাই করা বাগ থাকতে পারে।
এটি বলার পরে, আপনি এটি পরীক্ষা করে দেখতে চাইতে পারেন ।
পুরানো থ্রেড তবে যেহেতু আমি যখন unityক্য বনাম স্প্রিংটনে টাইপ করছিলাম তখন গুগল আমাকে প্রথম দেখিয়েছিল ...
আপনি যদি এক্সএমএল কনফিগারেশন পছন্দ না করেন তবে স্প্রিং এখন কোডকনফিগ করে
http://www.springframework.net/codeconfig/doc-latest/reference/html/
এছাড়াও, স্প্রিং কেবল একটি ডিআই কনটেইনারের চেয়ে অনেক বেশি, যদি আপনি ডক্সের 'মডিউল' বিভাগটি দেখেন, ডিআই কন্টেইনারটি এটি করে এমন বিশাল স্ট্যাকের ভিত্তি।
আমার ভুল হয়ে থাকলে আমাকে সংশোধন করুন তবে আমি মনে করি অটোফ্যাক নিজেই এই লিঙ্কটিতে তালিকাবদ্ধ হিসাবে এক্সএমএল কনফিগারেশন সমর্থন করে: অটোফ্যাক এক্সএমএল কনফিগারেশন
বসন্তের একটি বৈশিষ্ট্য রয়েছে যা এটি প্যারামিটারের নাম বা অবস্থানের ভিত্তিতে কনস্ট্রাক্টর বা সম্পত্তিতে পরামিতিগুলি ইনজেক্ট করতে পারে। প্যারামিটার বা সম্পত্তি একটি সাধারণ ধরণের (যেমন একটি পূর্ণসংখ্যা, একটি বুলিয়ান) হয় তবে এটি খুব কার্যকর। দেখুন উদাহরণ এখানে । আমি মনে করি না যে এটি কোডের মধ্যে কনফিগার করতে স্প্রিংয়ের অক্ষমতার জন্য সত্যই তৈরি করে।
উইন্ডসর এটিও করতে পারে এবং এটি কনফিগার না কোডেও করতে পারে। (আমি ভুল হলে আমাকে সংশোধন করুন, আমি এখানে যা শুনেছি তার মধ্য দিয়ে যাচ্ছি)।
আমি জানতে চাই Unক্য এটি করতে পারে কিনা।
একটি বিষয় লক্ষণীয়: নিনজেক্ট হ'ল একমাত্র IoC ধারক যা প্রাসঙ্গিক নির্ভরতা ইনজেকশনগুলিকে সমর্থন করে (তাদের ওয়েব সাইট অনুযায়ী)। তবে, অন্য আইওসি পাত্রে আমার অভিজ্ঞতা নেই বলে, এটি ধারণ করে কিনা তা আমি বলতে পারি না।
আমার 2 সেন্ট যোগ করার জন্য, আমি স্ট্রাকচারম্যাপ এবং bothক্য উভয়ই চেষ্টা করেছি। আমি স্ট্রাকচারম্যাপটি দুর্বল / বিভ্রান্তিকরভাবে নথিভুক্ত হতে, কনফিগার করার জন্য বাটে একটি ব্যথা এবং ব্যবহারের জন্য ক্লানকি পেয়েছি। অনুরূপভাবে, রেজোলিউশনের সময়ে কনস্ট্রাক্টর আর্গুমেন্টকে ওভাররাইড করার মতো পরিস্থিতি সমর্থন করে বলে মনে হয় না, যা আমার জন্য একটি মূল ব্যবহারের পয়েন্ট ছিল। তাই আমি এটিকে ফেলে দিয়ে ityক্য নিয়ে চলেছি এবং প্রায় 20 মিনিটের মধ্যে যা চাইছিলাম তা করে দিয়েছি।
আমি ব্যক্তিগতভাবে ইউনিটি ব্যবহার করি তবে এটি কেবল মাইক্রোসফ্টের পক্ষ থেকে। আমি এক কারণে সিদ্ধান্তের জন্য আফসোস করছি: এর বিপরীতে সবচেয়ে বড় জিনিসটির একটি বড় "বাগ" রয়েছে যা এটি ক্রমাগত ব্যতিক্রম ছুঁড়ে ফেলার কারণ করে। ডিবাগ করার সময় আপনি ব্যতিক্রমগুলি উপেক্ষা করতে পারেন। তবে আপনি যদি এটির জুড়ে চলে যান তবে এটি আপনার অ্যাপ্লিকেশনটি খুব ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে কমে যাবে an উদাহরণস্বরূপ, আমি বর্তমানে আমার কোডের একটি স্থানে এই ব্যতিক্রমটিকে "ফিক্সিং" করছি যেখানে ইউনিটির ব্যতিক্রমগুলি পৃষ্ঠার রেন্ডার সময়টিতে অতিরিক্ত 4 সেকেন্ড যুক্ত করে। আরও বিশদ বিবরণ এবং কর্মপরীক্ষার জন্য, দেখুন:
Ityক্য কি সর্বদা সিঙ্ক্রোনাইজেশন লকএক্সসেপশন নিক্ষেপ করা যায় না?