IOC的使用

-一个大坑 2019-07-17 01:56:23
网上找了一个ioc模板,看他的示例和我不用ioc时查差不多
我想像反射一样直接生成接口类要怎么写?
Type type = Assembly.Load("Service ").GetType("Service .BD01IService ");
BD01IService obj = (BD01IService)Activator.CreateInstance(type);

private readonly BD01IService _BD01IService;
private readonly MRAModel _MRAModel;

//public BD01Controller(BD01IService BD01IService)
//{
// _BD01IService = BD01IService;
//}


public static void MyBuild(this ContainerBuilder builder)
{
var assemblies = Helpers.ReflectionHelper.GetAllAssembliesCoreWeb();

//注册仓储 && Service
builder.RegisterAssemblyTypes(assemblies)
.Where(cc => cc.Name.EndsWith("Repository") |//筛选
cc.Name.EndsWith("Service"))
.PublicOnly()//只要public访问权限的
.Where(cc => cc.IsClass)//只要class型(主要为了排除值和interface类型)
.AsImplementedInterfaces();//自动以其实现的所有接口类型暴露(包括IDisposable接口)

//注册泛型仓储
builder.RegisterGeneric(typeof(BaseRepository<>)).As(typeof(IBaseRepository<>));

/*
//注册Controller
Assembly[] controllerAssemblies = assemblies.Where(x => x.FullName.Contains(".CoreApi")).ToArray();
builder.RegisterAssemblyTypes(controllerAssemblies)
.Where(cc => cc.Name.EndsWith("Controller"))
.AsSelf();
*/
}
...全文
218 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
-一个大坑 2019-07-25
  • 打赏
  • 举报
回复
引用 8 楼 娃都会打酱油了 的回复:
你用的哪种ioc,autofac之类的都很简单 看你最后又是services.AddTransient,这名字是core里面的,但不知道你是不是
.net code项目,用的autofac,研究了好久,总算做的差不多了。现在还有两个问题 第一个autofac的话属性加什么关键词自动注入,如果找不到就换Unity 第二个Service和IService在同一层,我不知道怎么循环注入,如果解决不了我就分开写
  • 打赏
  • 举报
回复
你用的哪种ioc,autofac之类的都很简单 看你最后又是services.AddTransient,这名字是core里面的,但不知道你是不是
-一个大坑 2019-07-25
  • 打赏
  • 举报
回复
琢磨了这么多天,总算差不多了 还有一个问题,我BLL和IBLL建两个项目可以这样循环

Register(services, "MRA.BLL", "MRA.IBLL");
public static void Register(IServiceCollection services, string implementationAssemblyName, string interfaceAssemblyName)
        {
            var implementationAssembly = Assembly.Load(implementationAssemblyName);
            var interfaceAssembly = Assembly.Load(interfaceAssemblyName);

            var implementationTypes =
                implementationAssembly.DefinedTypes.Where(t =>
                    t.IsClass && !t.IsAbstract && !t.IsGenericType && !t.IsNested);
            foreach (var type in implementationTypes)
            {
                var interfaceTypeName = interfaceAssemblyName + ".I" + type.Name;
                var interfaceType = interfaceAssembly.GetType(interfaceTypeName);
                services.AddTransient(interfaceType, type);
            }
        }
如果放在一个项目里怎么循环注册?
-一个大坑 2019-07-25
  • 打赏
  • 举报
回复
引用 8 楼 娃都会打酱油了 的回复:
你用的哪种ioc,autofac之类的都很简单 看你最后又是services.AddTransient,这名字是core里面的,但不知道你是不是
大佬还在吗,autofac我在BLL层调用DAL,如果不想用构造函数,直接定义属性,自动注入,需要在属性上加什么关键字 private IBaseRepository<MraBdPn> _IBaseRepository {get; set;}
-一个大坑 2019-07-17
  • 打赏
  • 举报
回复
引用 4 楼 上帝的亲哥哥 的回复:
官网下载页面:http://www.springframework.net/download.html 用Spring后,一切变得简单,网上找个Demo一看就行了,
这个不支持 .net code,而且要输入字符串的class,这种方式不好 IApplicationContext ctx = ContextRegistry.GetContext(); IUserInfo userInfo = (IUserInfo)ctx.GetObject("UserInfo");
上帝的亲哥哥 2019-07-17
  • 打赏
  • 举报
回复
引用 3 楼 -一个大坑 的回复:
[quote=引用 1 楼 上帝的亲哥哥 的回复:]
不是有现成的Spring.net吗,你干嘛要自己这样手写呢,还容易出错,IoC

网上找的一个,以前都是直接调用BLL,没有写IBLL

Spring.net 有没有可以直接复制代码可以用的或者直接下载的[/quote]

官网下载页面:http://www.springframework.net/download.html
用Spring后,一切变得简单,网上找个Demo一看就行了,
-一个大坑 2019-07-17
  • 打赏
  • 举报
回复
引用 1 楼 上帝的亲哥哥 的回复:
不是有现成的Spring.net吗,你干嘛要自己这样手写呢,还容易出错,IoC
网上找的一个,以前都是直接调用BLL,没有写IBLL Spring.net 有没有可以直接复制代码可以用的或者直接下载的
-一个大坑 2019-07-17
  • 打赏
  • 举报
回复
_BD01IService.Getaaa(); _BD01IService为null,失败 _BD01IService = new BD01Service(); _BD01IService.Getaaa();才行
上帝的亲哥哥 2019-07-17
  • 打赏
  • 举报
回复
不是有现成的Spring.net吗,你干嘛要自己这样手写呢,还容易出错,IoC

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧