C# Unity 对于泛型接口的支持

最近和小伙伴们在做一个前台小框架, 已经有些人用起来了。 但是之前框架没有引入 Ioc, 所以用户实现我们框架开放出去的接口后,我们只能通过反射来获取用户的实现类。这样一个问题就是我们虽然定义了接口, 但其实我们依然依赖于用户的实现,同时框架启动异常的慢。 所以我们打算使用开源 Ioc 框架来把完成依赖注入的动作。 我们就完全关心我们自己的接口, 然后用户可以自己把实现类注入到框架中来,这样不仅移除了依赖,同是也砍掉了反射,可以加快加载速度。

因为开放的接口中定义了泛型接口,所以选中支持泛型接口的 Unity 来完成 Ioc 功能。 下面一步步实现一个简单的 Unity 泛型接口实例。

首先定义三个项目:

  1. UnityPrimer 框架代码
  2. UnityPrimerClient 框架用户代码
  3. UnityPrimerInterfaces 框架接口

项目结构如图:

框架接口包含:

  1. 实体接口

    1. namespace UnityPrimerInterfaces.Interfaces
      {
          public interface IModel
          {
              string Name { get; set; }
          }
      }
  2. 泛型接口
    1. namespace UnityPrimerInterfaces.Interfaces
      {
          public interface IEnricher<T> where T:IModel
          {
              T StringToModel(string message);
              string ModelToString(T model);
          }
      }

框架用户实现代码:实现框架定义的接口,并且把实现实例注入到容器中。

  1. 接口实现

    1.  public class Model :IModel
          {
              private string name;
              public string Name
              {
                  get
                  {
                      return name;
                  }
                  set
                  {
                      name = value;
                  }
              }
          }
    2. public class Enricher<T> : IEnricher<T> where T:IModel
          {
              public T StringToModel(string message)
              {
                  var model =new Model() { Name = message };
                  return (T)((IModel)model);
              }
      
              public string ModelToString(T model)
              {
                  return model.Name;
              }
          }
  2. 注册器
    1. namespace UnityPrimerClient
      {
          public class Register
          {
              public static IUnityContainer Container;
              public static void Regist()
              {
                  Container = new UnityContainer();
      
                  Container.RegisterType(typeof(IEnricher<>), typeof(Enricher<>), "Sample");
                  //Container.RegisterType(typeof(IEnricher<IModel>), typeof(Enricher<Model>), "Sample");
                  //Container.RegisterInstance<IEnricher<IModel>>(new Enricher<Model>());
              }
      
          }
      }

框架代码:框架从容器中获取用户实现的对象,并进行操作。

  1. namespace UnityPrimer
    {
        class Program
        {
            static void Main(string[] args)
            {
                Register.Regist();
    
                var enricher = Register.Container.Resolve<IEnricher<IModel>>("Sample");
    
                IModel model = enricher.StringToModel("SampleModel");
                Console.WriteLine(enricher.ModelToString(model));
                Console.ReadLine();
    
            }
        }
    }

对于 Unity 来说,最容易出错的部分,就是 register 和 resolve 的时候。同是对于泛型接口,泛型约束会导致resolve失败。

时间: 2024-08-28 10:27:32

C# Unity 对于泛型接口的支持的相关文章

unity 开发总结

1.慎用线程,unity对线程的支持不是特别完善. 在一些网络通信,资源下载,解压文件,不得已要开线程操作的地方,需要进行线程回收. 2.不压缩的ab,比经过压缩的ab大了将近4倍. 在打包ngui的时候要注意依赖关系 3.Invoke效率比协程高5倍多,而且协程用多了会频繁进行垃圾回收,而垃圾回收会造成手机上卡顿 延迟操作封装自己的计时器,内存部分的优化则是用对象池 4.资源加密.md5,可以对前多少位后多少位进行操作即可,优化手机效率 5.cdn资源服务器也会有缓存 不能简单的在客户端htt

转:Oculus Unity Development Guide开发指南(2015-7-21更新)

http://forum.exceedu.com/forum/forum.php?mod=viewthread&tid=34175 Oculus Unity Development Guide开发指南转载请保留原始地   http://t.cn/RAblKoh Oculus/GearVR开发者群 302294234 Welcometo the Unity Development GuideIntroduction简介Welcometo the Oculus Unity Developer Gui

Unity资源解决方案之AssetBundle

1.什么是AssetBundle AssetBundle是Unity pro提供的一种用来存储资源的文件格式,它可以存储任意一种Unity引擎能够识别的资源,如Scene.Mesh.Material.Texture.Audio.noxss等等,同时,AssetBundle也可以包含开发者自定义的二进制文件,只需要将自定义文件的扩展名改为.bytes,Unity就可以把它识别为TextAsset,进而就可以被打包到AssetBundle中.Unity引擎所能识别的资源我们称为Asset,Asset

2017年Unity开发环境与插件配置安装(总体介绍)

最近(2017年初)有朋友问,Unity客户端开发如何在机器配置一般的情况下,配置更高效的开发环境,进一步加快开发进度. 推荐如下: Win10(或者Win8)+Unity5.5.1版本(2017年2月最新)+VS2012(或者VS2015) +UnityVS(支持Unity5.x版本)插件+Resharp8.0插件. 解释如下: 1: 操作系统推荐Win10或者Win8系统. 目前Unity5.0  以上版本都支持64位系统,带来更高的性能体验,所以不是太老的机器,一定用64位的Win操作系统

干货:Unity游戏开发图片纹理压缩方案

原文:http://www.jianshu.com/p/f7c3741f22af Unity3D引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式. 在Texture2D的设置选项中,你可以针对不同的平台,设置不同的压缩格式,如IOS设置成PVRTC4,Android平台设置成RGBA16等. 嗯,非常的智能. 但是,在一些进阶的使用中,一些情况是难以满足的. 比如,我们NGUI的图集纹理,在Android平台,使用ETC

NGUI在Unity中因更改窗口区域而出现Bug的处理

最近,在Unity5.0.1中遇到了NGUI中的一些BUG问题,比如,你用NGUI开发进行拖拽Sprite 的功能,或者在一些Lable上使用了dynamic font, 然后把它编译成可在PC上运行的exe可执行 文件 (记得 Player Settings的Resolution中勾上Resizealbe Window),  当它运行时,这时你就 会发现问题来了,比如打开时是720*480大小的窗口区域,然后你通过拖拽窗口边界,或者直接 进行窗口最大化放大,这时你会发现UI Root中的Spr

泛型接口、泛型委托、泛型方法、泛型约束

泛型接口 没有泛型接口,每次试图使用一个非泛型接口(如IComparable)来操纵一个值类型时,都会进行装箱,而且会丢失编译时的类型安全性.这会严重限制泛型类型的应用.所以,CLR提供了对泛型接口的支持.一个引用类型或值类型为了实现一个泛型接口,可以具体指定类型实参:另外,一个类型也可以保持类型实参的未指定状态来实现一个泛型接口.来看一些例子: 以下泛型接口定义是作为FCL的一部分发布的: public interface IEnumerable<T> : IDisposable, IEnu

Unity中的批处理优化与GPU Instancing【转】

我们都希望能够在场景中投入一百万个物体,不幸的是,渲染和管理大量的游戏对象是以牺牲CPU和GPU性能为代价的,因为有太多Draw Call的问题,最后我们必须找到其他的解决方案. 在本文中,我们将讨论两种优化技术,它们可以帮助您减少Unity游戏中的Draw Call数量以提高整体性能:批处理和GPU Instancing. 批处理开发者在日常工作中遇到的最常见的问题之一是性能不足,这是由于CPU和GPU的运行能力不足.一些游戏可以运行在PC上,但是在移动设备上不行.游戏运行时运行是否流畅受Dr

Unity渲染路径 Rendering Paths_1_Deferred Lighting 延时光照

Deferred Lighting 延时光照 延时光照是有着最高保真度的光照和阴影的渲染路径.如果你有很多实时灯光,最好是使用延时光照.它需要一定水平的硬件支持,仅在 Unity Pro可用,移动设备上不支持. 延迟光照是一种当前最高级的能实现光线和阴影保真的渲染路径 对于能影响任何物体的光线数量没有上限 完全采用以每像素的方式评估光线,这等于意味着全部将以正常贴图的方式正确的和物体交互 所有光线都能拥有信息缓存 所有的光线都能产生阴影 延迟光照的优点: 光照的开销与屏幕的光线尺寸成正比,不用担