我应该为ASP.NET MVC1.0使用哪个Autofac版本。另外,有哪些示例可以通过存储库模式将其与ASP.NET MVC一起使用?
public class MyController : BaseController
{
private readonly IUser _user;
private readonly ICompany _company;
public MyController(IUser user, ICompany company)
{
_user = user;
_company = company;
}
public ActionResult Index()
{
// Actions
}
}发布于 2011-05-13 02:42:25
我决定在我的应用程序中使用StructureMap。下面是我为实现它所做的工作:
创建我自己的CustomFactory类:
public class StructureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(Type controllerType)
{
if (controllerType == null)
{
return base.GetControllerInstance(controllerType);
}
try
{
return ObjectFactory.GetInstance(controllerType) as Controller;
}
catch (StructureMapException ex)
{
throw;
}
}
}创建一个Bootstrapper,使用StructureMap约定为我的程序集注册所有接口及其实现。(我在上面发布了一个blog post ):
public class StructureMapBootstrapper : IBootstrapper
{
private static bool hasStarted;
public void BootstrapStructureMap()
{
ObjectFactory.Initialize(x =>
{
x.AddRegistry<FactoryRegistry>();
});
}
public static void Restart()
{
if (hasStarted)
{
ObjectFactory.ResetDefaults();
}
else
{
Bootstrap();
hasStarted = true;
}
}
public static void Bootstrap()
{
new StructureMapBootstrapper().BootstrapStructureMap();
}
}
public class FactoryRegistry : Registry
{
public FactoryRegistry()
{
Scan(s =>
{
s.Assembly("Calendar.Library");
s.TheCallingAssembly();
s.AddAllTypesOf<IController>().NameBy(type => type.Name.Replace("Controller", "").ToLower());
s.WithDefaultConventions();
});
}
}在Global.asax.cs中注册StructureMap:
protected void Application_Start()
{
StructureMapBootstrapper.Bootstrap();
ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
}发布于 2011-05-13 00:11:03
我觉得你根本用不上它。
根据http://code.google.com/p/autofac/wiki/MvcIntegration的说法,只支持MVC2。
发布于 2011-05-13 00:47:14
对于ASP.NET MVC1,可以使用Autofac 1.4.1到1.4.4。我运行的是1.4.2。下面是Autofac 1.4.2的一个示例引导程序(删除了一些代码片段。不确定1.4.4中可能影响此代码的更改)。
namespace Web
{
public class PropertyInjectionForAllComponents : Module
{
protected override void AttachToComponentRegistration (IContainer container, IComponentRegistration registration)
{
registration.Activating += ActivatingHandler.InjectProperties;
}
}
public static class Bootstrapper
{
public static IContainerProvider ConfigureAutofac (string serverPath)
{
var configManager = new ConfigManager (new ConfigurationManagerWrapper ());
string environment = configManager.AppSettings ("Environment");
RequireSslAttribute.Enable = configManager.AppSettings ("EnableSSL").IsTrue ();
// Autofac IoC configuration see http://www.codeproject.com/KB/architecture/di-with-autofac.aspx for details
// ExternallyOwned () - Use on objects that are disposable which you do not want disposed such as Console.Out as an implementation TextWriter.
// OnActivating () - Allows property injection
// SingletonScoped () - Only one instance of the class will ever be created for the process. This is the default behavior.
// FactoryScoped () - Each time a component is requested from the container, a new instance will be created.
// ContainerScoped () - This provides the flexibility needed to implement per-thread, per-request, or per-transaction component life-cycles.
// HttpRequestScoped () - Means that at most one instance of the component will be created for each incoming web request. This is handy for items that should be shared within a single request, e.g. repositories.
var builder = new ContainerBuilder ();
// SCIBS.Core components
builder.Register (c => new HttpContextWrapper (HttpContext.Current)).As<HttpContextBase> ().HttpRequestScoped ();
builder.Register<ElmahLogger> ().As<ILogger> ().OnActivating (ActivatingHandler.InjectProperties).SingletonScoped ();
builder.Register<WebConfigurationManagerWrapper> ().WithArguments (new NamedParameter ("applicationVirtualPath", HostingEnvironment.ApplicationVirtualPath)).As<IConfigurationManager> ().SingletonScoped ();
builder.Register<ConfigManager> ().As<IConfigManager> ().SingletonScoped ();
builder.Register<AppSettings> ().As<IAppSettings> ().SingletonScoped ();
builder.Register<SparkTemplate> ().As<ITemplate> ().SingletonScoped ();
builder.Register<Security> ().As<ISecurity> ().HttpRequestScoped ();
builder.Register<MailerService> ().WithArguments (new NamedParameter ("mailLogger", new Log4NetLogger ("EmailLogger"))).As<IMailerService> ().FactoryScoped ();
builder.Register<QuoteService> ().As<IQuoteService> ().FactoryScoped ();
builder.Register<OrderService> ().As<IOrderService> ().FactoryScoped ();
builder.Register<AccountRepository> ().As<IAccountRepository> ().FactoryScoped ();
builder.Register<ContactService> ().As<IContactService> ().FactoryScoped ();
builder.Register<AccountService> ().As<IAccountService> ().FactoryScoped ();
builder.Register<AddressService> ().As<IAddressService> ().FactoryScoped ();
builder.Register<AspNetMembershipProvider> ().As<IMembershipProvider> ().FactoryScoped ();
var autofacControllerModule = new AutofacControllerModule (System.Reflection.Assembly.GetExecutingAssembly ());
autofacControllerModule.ActivatingHandler += ActivatingHandler.InjectProperties;
builder.RegisterModule (autofacControllerModule);
builder.RegisterModule (new PropertyInjectionForAllComponents ());
IContainerProvider containerProvider = new ContainerProvider (builder.Build ());
ControllerBuilder.Current.SetControllerFactory (new AutofacControllerFactory (containerProvider));
return containerProvider;
}
}
}以及如何从您的应用程序调用它:
public class MvcApplication : HttpApplication, IContainerProviderAccessor
{
private static IContainerProvider _containerProvider;
public IContainerProvider ContainerProvider
{
get
{
return _containerProvider;
}
}
protected void Application_Start ()
{
Log.Info ("Application_Start");
string serverPath = Server.MapPath ("~");
_containerProvider = Bootstrapper.ConfigureAutofac (serverPath);
var configManager = ContainerProvider.RequestContainer.Resolve<IConfigManager> ();
EnableSSL = configManager.AppSettings ("EnableSSL").IsTrue ();
RegisterRoutes (RouteTable.Routes);
// NOTE: http://stackoverflow.com/questions/2854024/how-to-prevent-debug-assert-to-show-a-modal-dialog
var logger = ContainerProvider.RequestContainer.Resolve<ILogger> ();
Debug.Listeners.Clear ();
Debug.Listeners.Add (new LoggerTraceListener () {Log = logger});
}
}https://stackoverflow.com/questions/5980759
复制相似问题