【发布时间】:2015-08-29 15:35:06
【问题描述】:
我正在学习实体框架并尝试使用工作者模式的通用存储库。使用 Castle Windsor 我通过接口注入所有内容。
但是工作单元属性 InternetRepository 是紧密耦合的:
public interface IUnitOfWork
{
IGenericRepository<RecordInternetSpeed> InternetSpeedRepository { get; }
void Save();
}
public class UnitOfWork :IUnitOfWork, IDisposable
{
private bool disposed = false;
private InternetSpeedEntities context = new InternetSpeedEntities();
private IGenericRepository<RecordInternetSpeed> internetSpeedRepository;
public IGenericRepository<RecordInternetSpeed> InternetSpeedRepository
{
get
{
if(this.internetSpeedRepository == null)
{
this.internetSpeedRepository = new GenericRepository<RecordInternetSpeed>(context);
}
return internetSpeedRepository;
}
}
public void Save()
{
context.SaveChanges();
}
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
如何注入此属性以使用接口?下面是IUnitOfWork 的调用方式:
private Timer timer;
private ICalculateInternetSpeed internetSpeed;
private IUnitOfWork unitOfWork;
public MyRunner(ICalculateInternetSpeed internetSpeed, IUnitOfWork unitOfWork)
{
this.internetSpeed = internetSpeed;
this.unitOfWork = unitOfWork;
}
public void Start()
{
timer = new Timer
{
//1000 (1 sec)
Interval = 5000,
Enabled = true
};
timer.Elapsed += (TimerElapsed);
}
public void Stop()
{
}
private void TimerElapsed(object sender, ElapsedEventArgs e)
{
try
{
timer.Enabled = false;
//Kick off method to get the download speed
var speed = internetSpeed.CalculateInternetDownloadSpeed();
Logger.Logger.Info("Internet Speed calculated.");
unitOfWork.InternetSpeedRepository.Insert(speed);
unitOfWork.Save();
Logger.Logger.Info(string.Format("Inserted record with ID {0} into the database.", speed.RecordId));
}
catch (Exception ex)
{
Logger.Logger.Error(ex.ToString());
}
finally
{
timer.Enabled = true;
}
}
}
然后在我的程序的主类中调用它:
private static void Main(string[] args)
{
container = new WindsorContainer(new XmlInterpreter());
container.Install(FromAssembly.This());
var runner = container.Resolve<IMyRunner>();
HostFactory.Run(x =>
{
x.Service<IMyRunner>(s =>
{
s.SetServiceName(ServiceName);
s.ConstructUsing(c => runner);
s.WhenStarted(tc => tc.Start());
s.WhenStopped(tc =>
{
tc.Stop();
container.Release(runner);
});
});
x.RunAsLocalSystem();
x.SetDescription(ServiceDescription);
x.SetDisplayName(ServiceDisplayName);
x.SetServiceName(ServiceName);
x.StartAutomatically();
});
}
我认为需要的最后一个代码 sn-p 是我的安装程序类:
public class Installer : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<IMyRunner>().ImplementedBy<MyRunner>().LifeStyle.Transient,
Component.For<ICalculateInternetSpeed>().ImplementedBy<CalculateInternetSpeed>().LifeStyle.Transient,
Component.For<IUnitOfWork>().ImplementedBy<UnitOfWork>().LifeStyle.Transient,
Component.For<ISimpleWebClient>().ImplementedBy<SimpleWebClient>(),
Component.For<IConfig>().ImplementedBy<Config>(),
Component.For<IGenericRepository<RecordInternetSpeed>>().ImplementedBy<GenericRepository<RecordInternetSpeed>>());
}
}
如您所见,我已尝试在此处注入它,但不确定这是否可行。这是进行属性注入的正确方法吗?
【问题讨论】:
标签: c# castle-windsor