मेरे पास ServiceManager
नामक एक सरल सेवा प्रबंधक है जिसमें दो विधियां हैं। Create()
एक सेवा का एक उदाहरण बनाता है। Provide()
एक सेवा देता है जो पहले बनाया गया था।प्रकारों और उदाहरणों के उदाहरण से उदाहरण प्राप्त करें
मेरे पास एक बुनियादी कार्यान्वयन है जो काम करता है लेकिन मुझे लगता है कि क्लीनर तरीका है या नहीं। यह ServiceManager
की मेरी बुनियादी दिया गया है:
public class ServiceManager : MonoBehaviour
{
private Dictionary<Type, MonoBehaviour> services = new Dictionary<Type, MonoBehaviour>();
public void Create<T>() where T : MonoBehaviour
{
// Create service
GameObject serviceObject = new GameObject(typeof(T).Name);
serviceObject.transform.SetParent(transform); // make service GO our child
T service = serviceObject.AddComponent<T>(); // attach service to GO
// Register service
services.Add(typeof(T), service);
}
public T Provide<T>() where T : MonoBehaviour
{
return (T)services[typeof(T)]; // notice the cast to T here
}
}
सेवा का उपयोग करना आसान है:
public class ServiceTest : MonoBehaviour
{
private void Start()
{
// Creating services
ServiceManager services = FindObjectOfType<ServiceManager>();
services.Create<MapService>();
services.Create<InteractionService>();
}
private void Example()
{
// Get a service
ServiceManager services = FindObjectOfType<ServiceManager>();
MapService map = services.Provide<MapService>();
// do whatever you want with map
}
}
मेरा प्रश्न ServiceManager.Provide()
बारे में है। शब्दकोश से आइटम प्राप्त करने के बाद टी को कास्ट पर ध्यान दें। यह बहुत अशुद्ध महसूस करता है और मुझे आश्चर्य होता है कि अगर मैं सी # में जेनेरिक काम कैसे करता हूं, तो मुझे कुछ याद आ रहा है। क्या मैं पूरा करने की कोशिश कर रहा हूं जो करने के लिए अन्य/बेहतर तरीके हैं?
* "यह बहुत अशुद्ध महसूस करता है" * - मेरे लिए यह नहीं है। मेरे लिए यह ठीक लग रहा है। जेनेरिक आपके लिए कुछ भी जादू नहीं करने जा रहे हैं। यह एक कलाकार है; वे दुर्घटना से भाषा में नहीं हैं। तुम अच्छे हो। –
@EdPlunkett ठीक है, धन्यवाद! बस यह सुनिश्चित करना चाहता था कि ऐसा कुछ नहीं था जिसे मैं समझ नहीं पाया था। चीयर्स। –